c++ - 类模板的 C++ 静态成员——链接器警告“多重定义”
问题描述
假设出于某种原因,我想要一个带有一些静态数据成员 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
链接器发出的“多重定义”警告将消失。
谢谢你们的帮助!
解决方案
推荐阅读
- git - git checkout 有什么区别吗
和 git checkout -b - entity-framework - EF Core Tools 不适用于 dotnet core 3 preview 4
- c# - 如何增加/减少输入速度?
- regex - 用于验证带有可选变量的 JSON 映射的正则表达式
- sql-server - 获取(案例?)组中 INT 的 ID 计数的最有效方法
- python - 用于绘图的反向标签编码
- pandas - 用于过滤的 Pandas query() 性能
- jquery - 如何解决数据表中闪亮的错位问题?
- symfony - Doctrine2:使用连接表中的字段作为映射实体的鉴别器
- python - 在 python 中使用 networkx 创建图形和执行链接预测时出错