Допустим, у нас есть следующие файлы:
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 (хотя я только что проверил, и я думаю, что это связано с чем-то другим, но я все равно опубликую этот вопрос)
Если шаблон, шаблон элемента или элемент шаблона класса
явно специализированный тогда эта специализация должна быть объявлена
до первого использования этой специализации, что вызвало бы
неявное создание экземпляра в каждой единице перевода в
какое такое использование происходит; Диагностика не требуется.
На самом деле, если вы объединяете их в одном TU, то и clang, и gcc выдаст ошибку. Вы должны объявить эти явные специализации.
И так как мы очень близки к этому, я просто процитирую [temp.expl.spec] / p7, потому что я могу:
Размещение явных объявлений специализации для функции
шаблоны, шаблоны классов, шаблоны переменных, функции-члены
шаблоны классов, статические данные, члены шаблонов классов, член
классы шаблонов классов, перечисления членов шаблонов классов,
шаблоны классов-членов шаблонов классов, шаблоны функций-членов
шаблонов классов, шаблоны статических данных членов шаблонов классов,
функции-члены шаблонов элементов шаблонов классов, член
функции шаблонов элементов не шаблонных классов, статические данные
шаблоны-члены не шаблонных классов, шаблоны функций-членов
элементы классов шаблонов классов и т. д., а также размещение частичных
объявления специализации шаблонов классов, шаблонов переменных,
шаблоны классов-членов классов, не являющихся шаблонами, статический член данных
шаблоны не шаблонных классов, шаблоны классов-членов класса
шаблоны и т. д. могут влиять на правильность формирования программы в соответствии с
на относительное позиционирование явной специализации
объявления и их пункты в модуле перевода
как указано выше и ниже. При написании специализации, будь
заботиться о его местонахождении; или сделать его компиляцией будет такое испытание
как разжечь его самосожжение.