假设出于某种原因,我想要一个带有一些静态数据成员 smDummyVar 的类模板 MyTemp :
我的临时文件
#ifndef MY_TEMP_H
#define MY_TEMP_H
template<class T>
class MyTemp{
...
private:
static int smDummyVar;
...
};
#include "MyTemp.cpp"
#endif //MY_TEMP_H
我的临时文件
...
template<class T> int MyTemp<T>::smDummyVar = 0;
...
由于编译器要求模板的定义和声明在同一个地方,所以我将 MyTemp.cpp 包含在 MyTemp.h 中。
现在:我想在很多地方使用 MyTemp 并使用模板创建对象:
案例1.cpp
#include "MyTemp.h"
void dummyfunc1(){
MyTemp<int> myTemp1;
}
案例2.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)
问题:我怎样才能摆脱这个警告?
非常感谢您的帮助!
=====================================
受此线程中的一个答案启发为什么模板只能在头文件中实现? 我找到了以下解决方案:
一世。#include "MyTemp.cpp"
在 MyTemp.h 中删除
ii. 专门的.h
#include "MyTemp.h"
typedef MyTemp<int> MySpecialized;
iii. 专门的.cpp
#include "MyTemp.cpp"
template class MyTemp<int>;
iv. 将specialized.cpp 提供给cmake 文件
v. 在 case1.cpp 和 case2.cpp 中包含 specilized.h
链接器发出的“多重定义”警告将消失。
谢谢你们的帮助!