我不确定你的意思是“初始化cpp内部的类型会产生链接器错误。”但假设你实际上的意思是定义为那么你必须做错了什么,因为在适当的位置为每种类型定义静态成员当然可行!你所拥有的类模板是一个对象的声明,如果它曾经被引用过,这需要在某个地方定义。只有MyType
碰巧是一个整数类型,你可以在你的类[template]中初始化它,并且你永远不需要它的地址(例如绑定到一个常量引用或者它的地址),而不用定义它。这是因为在这种情况下它始终被视为一个常量表达式。
我的猜测是,你试图定义一些CPP文件的对象是这样的:
template <typename T> MyType const MyClass<T>::Type = some-initialization-here;
这是行不通的,除非你也是在同一翻译单元或隐或显实例化这个定义。您可以定义成员的特定类型是这样的:
template <> MyType const MyClass<T>::Type = some-initialization-here;
除非你真正需要的类型是常量表达式在这种情况下,你通常可以侧步的问题,如果有必要通过成为一个enum
(这是我倾向于这样做,因为这家伙可以绑定到const
参考无需定义),您可以使用它可以在头部,而不是被定义静态成员函数:
template <typename T>
MyType const& MyClass<T>::Type() {
static MyType rc = some-initialization-here;
return rc;
}
BTW,我嗯非常确定这个问题之前回答,绝对在comp.lang.c++.moderated。
“在标题内部初始化类型将导致它被多次初始化。”你能否举一个例子来说明你如何去做?如果您只是检查构造函数是否被多次调用,则应该多次调用该构造函数,因为每个模板类实例化都有一个成员。 – hvd 2012-01-08 20:02:34