xem xét mã đơn giản:độ phân giải quá tải với nhiều chức năng và nhiều nhà khai thác chuyển đổi
#include<iostream>
struct A {
operator double(){
std::cout<<"Conversion function double chosen."<<std::endl;
return 1.1;
}
operator char(){
std::cout<<"Conversion function char chosen."<<std::endl;
return 'a';
}
} a;
void foo(int){}
void foo (char){}
int main() {
foo(a);
}
Trên đang hoạt động tốt, và như mong đợi gcc, kêu vang và VC++ chọn foo(char)
.
Bây giờ cho phép sửa đổi mã chút:
#include<iostream>
struct A {
operator double(){
std::cout<<"Conversion function double chosen."<<std::endl;
return 1.1;
}
operator char(){
std::cout<<"Conversion function char chosen."<<std::endl;
return 'a';
}
} a;
void foo(int){}
void foo (double){} //parameter changed from char to double
int main() {
foo(a);
}
Bây giờ này nên có chọn foo(double)
, nhưng dường như chỉ VC++ là hạnh phúc với mã trong khi kêu vang và gcc không hài lòng với đoạn code trên.
main.cpp:11:10: error: call of overloaded 'foo(A&)' is ambiguous
foo(a);
^
main.cpp:8:6: note: candidate: void foo(int)
void foo(int){}
^
main.cpp:9:6: note: candidate: void foo(double)
void foo (double){} //parameter changed from char to double
^
Bất cứ ai có thể giải thích lý do mã trên không thành công? hoặc là lỗi ?.
Một câu hỏi khác: Làm mã gcc và mã chia sẻ phân giải quá tải?
1: Xác định "không hài lòng". 2: Điều gì xảy ra nếu bạn xóa 'foo (int)'? – Amit
@Amit không hạnh phúc có nghĩa là mã bị từ chối, và như để loại bỏ các chức năng 'foo (int)', nó không phải là một phần của câu hỏi, bạn có thể thử nó cho mình xin vui lòng. –
@AngelusMortis: chức năng nào VC++ chọn? – davidhigh