2
// 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;

我现在可以包含A.h在多个 .cpp 文件中,也可以A<int>::a = 100;在一个 .cpp 文件中分配值,并在另一个文件中使用 .cpp 获得相同的值A<int>::a

  • 模板何时会产生如此大的不同?
  • 这个静态变量是否只有 1 个副本?哪个 .obj 会保留这个变量?
  • 构造函数是否只调用一次?如果初始值不同,哪一个获胜?
4

2 回答 2

1

模板何时会产生如此大的不同?

总是。我想我不明白这个问题。

这个静态变量是否只有 1 个副本?

T对于模板实例化的每种不同类型,最终程序中只有一个副本。

哪个 .obj 会保留这个变量?

所有这些都是从实例化模板的翻译单元生成的。然后链接器选择一个并丢弃所有其他的。

构造函数是否只调用一次?

每个专业一次。

如果初始值不同,哪一个获胜?

这将违反单一定义规则。这样的程序格式不正确,不需要诊断。

于 2013-08-30T05:26:33.273 回答
-1

为什么不在实现的源文件中定义静态成员class A?然后,您应该能够在没有A.h问题的情况下包含在多个源文件中。

// A.h
class A {
public:
  static int a;
};

// A.cpp
int A::a = 0;
于 2013-08-30T05:26:21.120 回答