Подтвердить что ты не робот

Явное создание шаблона шаблона для шаблона

Я не уверен, что это ошибка в Clang 3.2 или нарушение С++ 03, но похоже, что явное создание шаблонных конструкторов для классов шаблонов терпит неудачу, но выполняется явное создание шаблонных функций-членов классов шаблонов.

Например, следующие компиляции без проблемы с 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++, но не с 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 );

В частности, я вижу два сообщения об ошибке формы:

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>;
               ^

Является ли это нарушением стандарта или ошибкой в ​​clang++?

4b9b3361

Ответ 1

Похоже, вы обнаружили ошибку GCC. Они оба называют неявно объявленный конструктор копирования:

template Foo<int>::Foo( const Foo<int>& foo );
template Foo<float>::Foo( const Foo<float>& foo );

Per [temp.explicit] p4,

Если декларация явного экземпляра называет неявно объявленную специальную функцию-член (раздел 12), программа плохо сформирована.

Поэтому Clang корректно отклоняет этот код.