【发布时间】:2010-12-05 22:44:23
【问题描述】:
我不明白,为什么如果我们在标题中定义普通(非模板)类的静态变量,我们会出现链接器错误,但在模板的情况下一切正常,而且我们将有一个静态变量实例所有翻译单位:
是模板头(template.h):
// template.h
template<typename T>
class Templ {
public:
static int templStatic;
};
template<typename T> Templ<T>::templStatic = 0;
这是第一个使用模板的单元(unit1.cpp)
// unit1.cpp
#include "template.h"
int method1() {
return Templ<void>::templStatic++;
}
这里的第二个单元(unit2.cpp):
// unit2.cpp
#include "template.h"
int method2() {
return Templ<void>::templStatic++;
}
最后,main.cpp:
// main.cpp
#include <iostream>
int method1();
int method2();
int main(int argc, char** argv) {
std::cout << method1() << std::endl;
std::cout << method2() << std::endl;
}
在编译、链接和执行这段代码之后,我们会得到如下输出:
0
1
那么,为什么在模板的情况下一切正常(并且如预期的那样)?编译器或链接器如何处理这个问题(我们可以在编译器的单独调用中编译每个 .cpp 文件,然后将它们与 caling 链接到链接器,因此编译器和链接器不会同时“看到”所有 .cpp 文件)?
PS:我的编译器:msvcpp 9(但也检查了 mingw)
【问题讨论】:
-
如果您向我们展示不起作用的代码会更有用。
-
我认为不起作用的代码是您在标头中定义变量的代码,该变量包含在多个文件(未外部)中,这会导致命名冲突。跨度>