让我们说说由于某种原因,我想要一个带有一些静态数据成员smDummyVar的类模板MyTemp:
Mytemp.h
#ifndef MY_TEMP_H
#define MY_TEMP_H
template<class T>
class MyTemp{
...
private:
static int smDummyVar;
...
};
#include "MyTemp.cpp"
#endif //MY_TEMP_H
Mytemp.cpp
...
template<class T> int MyTemp<T>::smDummyVar = 0;
...
由于编译器要求模板的定义和声明位于同一位置,因此我将MyTemp.cpp包含在MyTemp.h中。
现在:我想在许多地方使用MyTemp并使用模板创建对象:
case1.cpp
#include "MyTemp.h"
void dummyfunc1(){
MyTemp<int> myTemp1;
}
case2.cpp
#include "MyTemp.h"
void dummyfunc2(){
MyTemp<int> myTemp2;
}
我不会从编译器中得到任何错误,但是会从链接器中得到警告:
"multiple definition for MyTemp<int>::smDummyVar" ... defined in invalid_group(case1.o) ... rejected in favour of symbol defined in ...(case2.o)
问题:如何摆脱这个警告?
非常感谢您的帮助!
===================================
受到此主题Why can templates only be implemented in the header file?中答案之一的启发 我找到了以下解决方案:
i。在MyTemp.h中删除#include "MyTemp.cpp"
ii。 h.p
#include "MyTemp.h"
typedef MyTemp<int> MySpecialized;
iii。 specialized.cpp
#include "MyTemp.cpp"
template class MyTemp<int>;
iv。给cmd文件添加specialized.cpp
v。在case1.cpp和case2.cpp中包括specilized.h
链接器发出的“多重定义”警告将消失。
谢谢你们的帮助!