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

C++ 类模板中的静态成员初始化,c++,templates,static,C++,Templates,Static,我想这样做: template <typename T> struct S { ... static double something_relevant = 1.5; }; 模板 结构 { ... 静态双相关系数=1.5; }; 但是我不能,因为相关的东西不是整数类型。它不依赖于t,但现有代码依赖于它是S的静态成员 因为S是模板,所以我不能将定义放在编译文件中。如何解决此问题?只需在标题中定义它: template <typename T> struc

我想这样做:

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};
模板
结构
{
...
静态双相关系数=1.5;
};
但是我不能,因为相关的东西不是整数类型。它不依赖于
t
,但现有代码依赖于它是
S
的静态成员


因为S是模板,所以我不能将定义放在编译文件中。如何解决此问题?

只需在标题中定义它:

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

template <typename T>
double S<T>::something_relevant = 1.5;
模板
结构
{
静态双相关;
};
模板
双S::相关的东西=1.5;
因为它是模板的一部分,就像所有模板一样,编译器将确保它只定义一次

这会有用的

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;
模板
结构
{
静态双相关;
};
模板
双S::相关的东西=1.5;

自C++17以来,您现在可以将静态成员声明为
内联
,这将在类定义中定义变量:

template <typename T>
struct S
{
    ...
    static inline double something_relevant = 1.5;
};
模板
结构
{
...
静态内联双相关=1.5;
};

live:

@sbi:它是否违反了“一个定义”规则?不,如果我们讨论的是模板,则不会。否则函数模板也会这样做。@sbi,@Prasoon:实际上,Prasoon似乎是第一个。但我仍然接受sbi的意见,因为它对ODR的评论(这是我最关心的)。@sbi只是停留在文字上:)@Johannes:Dammit,我在这里一年了,我不知道!我还缺什么?(我还记得当我发现点击投票数时出现的两个数字不是一个bug,而是一个特性时的羞愧。)
哇,当我悬停在你的名字上方时,我看到了你的代表!我也不知道那个@普拉松:不,你是对的,我反复地到达了现在的位置。(这就是为什么我对你的答案投了赞成票,顺便说一句)也适用于
std::string
typec++11以来,关键字inline已经更改,因此可以在声明点初始化静态变量。所以这个声明看起来像“内联静态double something_related=1.5;”@user8991265我相信内联变量是可以使用的,因为C++17,而不是C++11。这是一个很好的答案。简短而准确。有关更多信息,请参见。我没有定义与something\u相关的变量(我删除了
template double S::something\u related=1.5;)
编译器抛出错误。您能告诉我原因吗?