Явная реализация шаблонного конструктора для шаблонного класса
Я не уверен, является ли это ошибкой в Clang 3.2 или нарушением C ++ 03, но кажется, что явное создание экземпляров шаблонных конструкторов для шаблонных классов завершается неудачно, но явное создание экземпляров шаблонных функций классов-шаблонов успешно.
Например, следующее компилируется без проблем с clang ++ и g ++:
template
class Foo
{
public:
template
void Bar( const Foo& foo )
{ }
};
template class Foo;
template class Foo;
template void Foo::Bar( const Foo& foo );
template void Foo::Bar( const Foo& foo );
template void Foo::Bar( const Foo& foo );
template void Foo::Bar( const Foo& foo );
в то время как следующее компилируется без предупреждения с g ++, но не с clang ++:
template
class Foo
{
public:
template
Foo( const Foo& foo )
{ }
};
template class Foo;
template class Foo;
template Foo::Foo( const Foo& foo );
template Foo::Foo( const Foo& foo );
template Foo::Foo( const Foo& foo );
template Foo::Foo( const Foo& foo );
В частности, я вижу два сообщения об ошибках вида:
TemplateMember.cpp:12:20: error: explicit instantiation refers to member
function 'Foo::Foo' that is not an instantiation
template Foo::Foo( const Foo& foo );
^
TemplateMember.cpp:9:16: note: explicit instantiation refers here
template class Foo;
^
Это нарушение стандарта или ошибка в clang ++?