Mã sau hoạt động với Visual Studio 2008 nhưng không phải với GCC/G ++ 4.3.4 20090804. Hành vi nào là - theo tiêu chuẩn C++ - chính xác ?GCC/VS2008: Hành vi khác nhau của hàm gọi khi lớp cơ sở templated bắt nguồn từ chính nó
template <int N>
struct A : A<N-1> {};
template <>
struct A<0> {};
struct B : A<1> {};
template <int N>
void Func(const A<N> &a) {}
int main()
{
A<1> a; //is derived from A<0>
Func(a); //vs2008: ok, g++: ok
//Comeau: ok
B b; //is derived from A<1>
Func(b); //vs2008: ok, g++: error, no matching function for call to Func(B&)
//Comeau: error: no instance of function template "Func" matches the
// argument list. The argument types that you used are: (B).
return 0;
}
Nếu tôi quá tải Func() với
void Func(const A<0> &a) { std::cout << '0'; }
void Func(const A<1> &a) { std::cout << '1'; }
lúc nào cũng là một thứ hai được gọi là (như mong đợi). Vì vậy, tôi cũng sẽ mong đợi các chức năng templated được gọi với N = 1 vì A < 1> là cơ sở trực tiếp của B. Giả định này thực sự sai?
Không biên dịch bằng Comeau Online. Bạn mong đợi gì ở trường hợp thứ hai (vì b có thể chuyển đổi thành A <1> và A <0>)? – UncleBens
Tôi nghĩ rằng đó chỉ là một phần mở rộng MSVC++ khác. –
@UncleBens, wow tôi đã không thấy rằng 'B' cũng thừa kế' A <0> '!Mắt tốt :) –