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


148

我想这样做:

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

但是我不能,因为something_relevant它不是整数类型。它不依赖T,但是现有的代码取决于它是的静态成员S

由于S是模板,因此无法将定义放入编译文件中。我该如何解决这个问题?


也适用于std::string类型
Trevor Boyd Smith,

从c ++ 11开始,关键字inline已更改,因此可以在声明时初始化静态变量。因此,此声明看起来像是“内联静态double something_relevant = 1.5;”。

@ user8991265我相信自C ++ 17以来(而不是C ++ 11)可以使用内联变量。
zupazt3

Answers:


195

只需在标题中定义它:

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

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

由于它是模板的一部分,因此与所有模板一样,编译器将确保仅定义一次。


4
@sbi:它不违反一个定义规则吗?
Alexandre C.

7
不,如果我们在谈论模板,则不会。否则,功能模板也将这样做。
2010年

1
@ sbi,@ Prasoon:实际上,Prasoon似乎是第一个。但由于对ODR的评论(这是我的主要关注),我仍然接受sbi的评论。
Alexandre C.

1
@sbi只是将鼠标悬停在文本上:)
Johannes Schaub-litb 2010年

5
@Johannes:该死,我在这里呆了一年,我不知道!我还想念什么?(当我发现单击投票数时出现的两个数字不是bug而是功能时,我仍然感到羞耻。)<goes_playing>哇,当我将鼠标悬停在您的名字上时,我看到了您的代表!我也不知道那个。@Prasoon:不,你是对的,我反复到达了现在。(这就是为什么我投票赞成你的答案,顺便说一句。)
2010年


31

这会起作用

template <typename T>
 struct S
 {

     static double something_relevant;
 };

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

我没有定义something_relevant变量(我删除了template<typename T> double S<T>::something_relevant=1.5;)编译器引发的错误。您能告诉我原因是什么吗?
goodman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.