Инициализация статического члена в шаблоне класса - PullRequest
128 голосов
/ 12 июля 2010

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

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

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

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

Ответы [ 3 ]

166 голосов
/ 12 июля 2010

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

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

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

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

31 голосов
/ 12 июля 2010

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

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;
16 голосов
/ 30 июля 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...