Tôi không chắc chắn nếu nó là lỗi trong Clang 3.2 hoặc vi phạm C++ 03, nhưng có vẻ như việc khởi tạo rõ ràng các hàm tạo khuôn mẫu cho các lớp mẫu không thành công. các hàm thành viên của các lớp mẫu thành công.Sự khởi tạo rõ ràng của hàm tạo khuôn mẫu cho lớp mẫu
Ví dụ, biên dịch sau đây mà không có một vấn đề với cả hai kêu vang ++ và g ++:
template<typename T>
class Foo
{
public:
template<typename S>
void Bar(const Foo<S>& foo)
{ }
};
template class Foo<int>;
template class Foo<float>;
template void Foo<int>::Bar(const Foo<int>& foo);
template void Foo<int>::Bar(const Foo<float>& foo);
template void Foo<float>::Bar(const Foo<int>& foo);
template void Foo<float>::Bar(const Foo<float>& foo);
trong khi biên dịch sau đây mà không cảnh báo với g ++ nhưng không thành công với kêu vang ++:
template<typename T>
class Foo
{
public:
template<typename S>
Foo(const Foo<S>& foo)
{ }
};
template class Foo<int>;
template class Foo<float>;
template Foo<int>::Foo(const Foo<int>& foo);
template Foo<int>::Foo(const Foo<float>& foo);
template Foo<float>::Foo(const Foo<int>& foo);
template Foo<float>::Foo(const Foo<float>& foo);
Đặc biệt, tôi thấy hai thông báo lỗi của biểu mẫu:
TemplateMember.cpp:12:20: error: explicit instantiation refers to member
function 'Foo<int>::Foo' that is not an instantiation
template Foo<int>::Foo(const Foo<int>& foo);
^
TemplateMember.cpp:9:16: note: explicit instantiation refers here
template class Foo<int>;
^
Đây có phải là vi phạm không tiêu chuẩn hoặc lỗi trong clang ++?
Hình như C++ 03 hợp lệ. Có lẽ lỗi trong Clang ++ –