类模板中的静态成员初始化

Ale*_* C. 138 c++ static templates

我想这样做:

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};
Run Code Online (Sandbox Code Playgroud)

但我不能因为something_relevant不是整体类型.它不依赖于T,但现有代码依赖于它是静态成员S.

由于S是模板,我不能将定义放在编译文件中.我该如何解决这个问题?

sbi*_*sbi 177

只需在标题中定义它:

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

template <typename T>
double S<T>::something_relevant = 1.5;
Run Code Online (Sandbox Code Playgroud)

因为它是模板的一部分,所以与所有模板一样,编译器将确保它只定义一次.

  • 不,如果我们正在谈论模板,那就不行了.否则,功能模板也会这样做. (7认同)
  • @Johannes:该死的,我在这里待了一年,我不知道!我还缺少什么?(当我发现点击投票数时出现的两个数字不是错误,而是一个特征时,我仍然记得羞耻.)``go_playing>`哇,当我将鼠标悬停在你的名字上时,我看到了你的代表!我也不知道那一个.@Prasoon:不,你是对的,我迭代地到达现在的位置.(这就是我投票给你答案的原因,顺便说一下.) (5认同)
  • @sbi:它不违反一个定义规则吗? (4认同)
  • @sbi 只需将鼠标悬停在文本上即可:) (2认同)

Pra*_*rav 31

这会奏效

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;
Run Code Online (Sandbox Code Playgroud)


xax*_*xon 25

从C++ 17开始,您现在可以声明静态成员inline,它将在类定义中定义变量:

template <typename T>
struct S
{
    ...
    static inline double something_relevant = 1.5;
};
Run Code Online (Sandbox Code Playgroud)

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

  • 有人想知道为什么标准委员会认为有必要要求一个额外的关键字,而不是仅仅使以前非法的静态声明合法化。 (4认同)
  • 这是一个很好的答案。简短而精确。另请参阅 https://en.cppreference.com/w/cpp/language/static#Static_data_members 了解更多信息。 (3认同)