【问题标题】:Where to define static const member variables of a template class在哪里定义模板类的静态 const 成员变量
【发布时间】:2011-06-22 01:32:20
【问题描述】:

据此question'sanswer

According to the standards you must define i (这是一个静态 const 成员) outside of the class definition

...但是如果我对本身是通用的模板类的静态 const 成员变量执行此操作,则会出现链接错误(如果模板代码位于单独的编译单元中,则类似于出现链接错误)。如果我在标题中定义它们,链接错误就会消失(我首先在this question 中询问是否可以以generic 方式定义它们)。

我在做什么,安全吗?下面是标题中静态 const 成员变量的定义之一。

  template<typename T, unsigned int T_Size> 
  const Vector<T, T_Size> Vector<T, T_Size>::Zero = Vector<T, T_Size>(0);

【问题讨论】:

  • 你能发布一个完整的失败例子吗?这个问题对细节很敏感。无论如何,您都应该将通用静态 const 成员初始化放在标头中。您还可以通过template Vector&lt;int, 4&gt;; 请求在翻译单元中显式实例化模板。
  • @Kerrek:只需将问题中的定义放在 .cpp 而不是标题中。
  • @Xeo:对我来说很好,我无法重现链接器错误。
  • @Kerrek:在多个翻译单元中包含带有模板的标题?
  • @Kerrek,如果我进行显式实例化,则不会出现链接错误,但由于此 Vector 类是通用的,因此不是解决方案。至于错误,如果将定义放在*.cpp文件中没有显式实例化模板,然后尝试在另一个编译单元中实例化一个,则会出现链接错误。

标签: c++ templates


【解决方案1】:

类模板的静态数据成员必须在头文件中定义。只有在定义显式特化模板的静态成员时,才必须在实现文件中定义它们。

换句话说,规则与类模板的成员函数相同。

【讨论】:

    【解决方案2】:

    因为每个翻译单元都需要一个完整的模板定义,是的,这是要走的路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-13
      • 2021-08-27
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多