// A.h
class A {
public:
static int a;
};
int A::a = 0;
如果我尝试将A.h
包含在多个.cpp文件中,则链接将失败并显示multiple definition of A::a
。我认为这是有道理的,因为每个.obj文件都包含A::a
但是,我可以使用模板
// A.h
template<class T>
class A {
public:
static T a;
};
template<class T>
T A<T>::a = 0;
我现在可以在多个.cpp文件中包含A.h
,我也可以在一个.cpp文件中分配值A<int>::a = 100;
,并在另一个A<int>::a
中获取相同的值。< / p>
答案 0 :(得分:1)
模板何时产生这种差异?
始终。我想我不明白这个问题。
这个静态变量只有一个副本吗?
最终程序中只有一个副本用于每个不同类型T
模板的实例化。
哪个.obj会保留这个变量?
所有这些都是从实例化模板的翻译单元生成的。然后链接器选择一个并丢弃所有其他链接。
构造函数只调用一次吗?
每次专业化一次。
如果初始值不同,哪一个胜出?
这将违反一个定义规则。这样的程序将是不正确的,不需要诊断。
答案 1 :(得分:-1)
为什么不在实现class A
的源文件中定义静态成员?然后,您应该能够将A.h
包含在没有问题的多个源文件中。
// A.h
class A {
public:
static int a;
};
// A.cpp
int A::a = 0;