【问题标题】:Static member initialization in a class template类模板中的静态成员初始化
【发布时间】:2011-03-14 21:06:51
【问题描述】:

我想这样做:

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

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

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

【问题讨论】:

  • 同样适用于std::string类型
  • 自 c++11 以来,关键字 inline 发生了变化,因此可以在声明点初始化静态变量。所以这个声明看起来像“inline static double something_relevant = 1.5;”
  • @user8991265 我相信内联变量从 C++17 开始可用,而不是 C++11。

标签: c++ templates static


【解决方案1】:

只需在标题中定义它:

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

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

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

【讨论】:

  • @sbi: 不违反一定义规则吗?
  • 不,如果我们谈论的是模板,则不是。否则函数模板也会这样做。
  • @sbi, @Prasoon:实际上 Prasoon 似乎是第一个。但由于对 ODR 的评论(这是我最关心的问题),我仍然接受 sbi。
  • @sbi 只需将鼠标悬停在文本上 :)
  • @Johannes:该死,我在这里待了一年,但我不知道!我还缺少什么? (我仍然记得当我发现点击投票数时出现的两个数字不是错误,而是一个功能时的耻辱。)&lt;goes_playing&gt;哇,当我将鼠标悬停在你的名字上时,我看到了你的代表!我也不知道那个。 @Prasoon:不,你是对的,我反复到达现在的位置。 (这就是为什么我对你的答案投了赞成票,顺便说一句。)
【解决方案2】:

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

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

直播:https://godbolt.org/g/bgSw1u

【讨论】:

【解决方案3】:

这会起作用

template <typename T>
 struct S
 {

     static double something_relevant;
 };

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

【讨论】:

  • 我没有定义 something_relevant 变量(我删除了 template&lt;typename T&gt; double S&lt;T&gt;::something_relevant=1.5;) 编译器抛出错误。你能告诉我是什么原因吗?
  • 这将在包含这些行的每个模块中引入变量的副本。又如何确保变量只存在于一个共享模块中,而其他模块引用它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2011-03-19
  • 2021-10-21
  • 2019-05-03
相关资源
最近更新 更多