Как правильно явно создать экземпляр класса шаблона с полностью специализированными членами?

Допустим, у нас есть следующие файлы:

foo.h

namespace ns
{
template <typename T>
class Foo
{
public:
Foo();

~Foo();

void DoIt();
};
}

foo.cpp

#include "foo.h"
#include <iostream>

namespace ns
{
template <typename T>
Foo<T>::Foo() { std::cout << "Being constructed." << std::endl; }

template <typename T>
Foo<T>::~Foo() { std::cout << "Being destroyed." << std::endl; }

template <>
void Foo<int>::DoIt()
{
std::cout << "Int" << std::endl;
}

template <>
void Foo<double>::DoIt()
{
std::cout << "Double" << std::endl;
}

template class Foo<int>;
template class Foo<double>;
}

Это правильный способ сделать явную реализацию, предполагая, что тип будет когда-либо использоваться только с int или double в качестве параметров типа? Или вам нужно объявить явную специализацию и в заголовочном файле?

Делать так, как я показал, работает с visual studio, но у коллеги были проблемы с GCC (хотя я только что проверил, и я думаю, что это связано с чем-то другим, но я все равно опубликую этот вопрос)

4

Решение

[temp.expl.spec] / p6 (выделено мной):

Если шаблон, шаблон элемента или элемент шаблона класса
явно специализированный тогда эта специализация должна быть объявлена
до первого использования этой специализации, что вызвало бы
неявное создание экземпляра в каждой единице перевода в
какое такое использование происходит
; Диагностика не требуется.

На самом деле, если вы объединяете их в одном TU, то и clang, и gcc выдаст ошибку. Вы должны объявить эти явные специализации.


И так как мы очень близки к этому, я просто процитирую [temp.expl.spec] / p7, потому что я могу:

Размещение явных объявлений специализации для функции
шаблоны, шаблоны классов, шаблоны переменных, функции-члены
шаблоны классов, статические данные, члены шаблонов классов, член
классы шаблонов классов, перечисления членов шаблонов классов,
шаблоны классов-членов шаблонов классов, шаблоны функций-членов
шаблонов классов, шаблоны статических данных членов шаблонов классов,
функции-члены шаблонов элементов шаблонов классов, член
функции шаблонов элементов не шаблонных классов, статические данные
шаблоны-члены не шаблонных классов, шаблоны функций-членов
элементы классов шаблонов классов и т. д., а также размещение частичных
объявления специализации шаблонов классов, шаблонов переменных,
шаблоны классов-членов классов, не являющихся шаблонами, статический член данных
шаблоны не шаблонных классов, шаблоны классов-членов класса
шаблоны и т. д. могут влиять на правильность формирования программы в соответствии с
на относительное позиционирование явной специализации
объявления и их пункты в модуле перевода
как указано выше и ниже. При написании специализации, будь
заботиться о его местонахождении; или сделать его компиляцией будет такое испытание
как разжечь его самосожжение.

5

Другие решения


По вопросам рекламы [email protected]