Intereting Posts
Каков наилучший эффективный способ чтения миллионов целых чисел, разделенных строками из текстового файла в c ++ C ++ явная спецификация шаблона шаблонного шаблона шаблонного classа Центрировать текст QTextEdit по горизонтали и вертикали Возможно ли получить доступ к значениям параметров шаблона непигового типа в специализированном classе шаблонов? Создание нескольких предварительно скомпилированных файлов заголовков с использованием GNU make Алгоритм реверберации Как установить цвет фона и ширину границы пользовательского виджета? Каким будет решение на основе CRTP? Как class Derived наследует статическую функцию от базового classа? Определение и использование Memset Сделать Eclipse обрабатывать файл .h как C ++? Функция шаблона не будет компилироваться при вызове как stream c ++ 11 Производительность Variadic Printf Могу ли я вызвать memcpy () и memmove () с «числом байтов», установленным на ноль? Как открыть файл на C ++?

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

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

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

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

     template Foo::Foo( const Foo& foo ); template Foo::Foo( const Foo& foo ); 

    Per [temp.explicit] p4,

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

    Поэтому Clang правильно отклоняет этот код.