Специализация класса со статическим членом

Делаю шаблон класса. В шаблонном классе некоторые реализации (в зависимости от типа должны отличаться) В каждом таком классе должен быть статический объект этого класса.

Взял код из ответа

template<typename T> class X
{
public:
    static T t;
};

template<> class X<double>
{
public:
    static double t;
};

double X<double>::t = 5.0f;

В этом примере статическая переменная не экземпляр самого класса, но сути это не меняет. Как только я подключаю заголовочный файл с этим кодом 2 двум cpp фпйлам проекта, вылезает ошибка: multiple definition of `X::t'

Это и логично, ведь реализация статического члена обычно делается отдельно в cpp файле. Но с другимы шаблонами это работает. К примеру собирается нормально такой код:

template<typename T>
class C{
public:
    T t;
    static int st;
};
template<typename T>
int C<T>::st;

template<typename T>
class C<T*>{
public:
    T* t;
    static int st;
};
template<typename T>
int C<T*>::st;

И успешно работает с двумя cpp файлами даже если использовать один и тот же тип в шаблоне. В чем же дело? И как сделать рабочим первый пример? Делать отдельный cpp файл со всеми нужными реализациями шаблона или статической переменной не предлагайте. Как я узнаю какие типы мне понадобятся наперед? Использую c++11


Ответы (1 шт):

Автор решения: Harry

Попробуйте так:

template<> class X<double>
{
public:
    inline static double t = 5.0f;
};

Ну, или перенесите определение в один из .cpp-файлов, поскольку это уже никак не шаблон...

→ Ссылка