首页 > 解决方案 > 类模板的 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

链接器发出的“多重定义”警告将消失。

谢谢你们的帮助!

标签: c++templatesstatic-memberslinker-warning

解决方案


推荐阅读