我不确定它是否是Clang 3.2中的错误或者是C03的错误,但是模板类的模板化构造函数的显式实例化似乎失败了,但模板类的模板化成员函数的显式实例化成功.
例如,以下编译与clang和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 );
而以下编译没有警告与g但与cl声失败:
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 );
特别是,我看到两个错误消息的形式:
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>; ^
这是违反标准还是cl a的错误?
解决方法
看起来你发现了一个GCC错误.这两个命名为隐式声明的复制构造函数:
template Foo<int>::Foo( const Foo<int>& foo ); template Foo<float>::Foo( const Foo<float>& foo );
按[temp.explicit] p4,
If the declaration of the explicit instantiation names an implicitly-declared special member function (Clause 12),the program is ill-formed.
所以Clang是拒绝这个代码的.