Инициализация статического члена в шаблоне класса

Я хотел бы сделать это:

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};

но я не могу, так как something_relevant не имеет интегрального типа. Он не зависит от T, но существующий код зависит от того, что он является статическим членом S.

Поскольку S является шаблоном, я не могу поместить определение внутри скомпилированного файла. Как решить эту проблему?

Ответ 1

Просто определите его в заголовке:

template <typename T>
struct S
{
    static double something_relevant;
};

template <typename T>
double S<T>::something_relevant = 1.5;

Поскольку он является частью шаблона, как и для всех шаблонов, компилятор будет удостовериться, что он определен только один раз.

Ответ 2

Это будет работать

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;

Ответ 3

Начиная с С++ 17, теперь вы можете объявить статический член inline, который определит переменную в определении класса:

template <typename T>
struct S
{
    ...
    static inline double something_relevant = 1.5;
};

live: https://godbolt.org/g/bgSw1u