我不明白,爲什麼如果我們在頭中定義通常(非模板)類的靜態變量,我們有鏈接器錯誤,但在模板的情況下一切正常,而且我們將有單個實例所有的翻譯單位之間的靜態變量:模板靜態變量
它的模板頭(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中:
0
1
:
// main.cpp
#include <iostream>
int method1();
int method2();
int main(int argc, char** argv) {
std::cout << method1() << std::endl;
std::cout << method2() << std::endl;
}
compilling,鏈接和執行該代碼後,我們將輸出以下
那麼,爲什麼在模板的情況下工作正常(和預期的一樣)?編譯器或鏈接器如何處理這個問題(我們可以在分別調用編譯器的情況下編譯每個.cpp文件,然後將它們鏈接到鏈接器,因此編譯器和鏈接器不會同時「看到」所有.cpp文件)?
PS:我的編譯器:msvcpp 9(但查了MinGW的太)
如果你向我們展示了**沒有工作的代碼,它會更有用。 – JesperE 2009-10-12 10:43:01
我想代碼不起作用的是你在頭文件中定義了一個變量,該頭文件被包含在多個文件中(沒有出現),這會導致命名衝突。 – falstro 2009-10-12 10:46:15