【发布时间】:2011-06-22 01:32:20
【问题描述】:
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<int, 4>;请求在翻译单元中显式实例化模板。 -
@Kerrek:只需将问题中的定义放在 .cpp 而不是标题中。
-
@Xeo:对我来说很好,我无法重现链接器错误。
-
@Kerrek:在多个翻译单元中包含带有模板的标题?
-
@Kerrek,如果我进行显式实例化,则不会出现链接错误,但由于此 Vector 类是通用的,因此不是解决方案。至于错误,如果将定义放在
*.cpp文件中没有显式实例化模板,然后尝试在另一个编译单元中实例化一个,则会出现链接错误。