Je ne sais pas s'il s'agit d'un bogue dans Clang 3.2 ou d'une violation de C++03, mais il semble que l'instanciation explicite des constructeurs template pour les classes template échoue, mais que l'instanciation explicite des fonctions membres templated des classes template réussit.
Par exemple, le texte suivant se compile sans problème avec clang++ et 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 );
alors que la version suivante se compile sans avertissement avec g++ mais échoue avec clang++ :
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 );
En particulier, je vois deux messages d'erreur de la forme :
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>;
^
S'agit-il d'une violation de la norme ou d'un bogue dans clang++ ?