类模板的C ++静态成员-链接器警告“多个定义”

时间:2018-07-18 17:55:55

标签: c++ templates static-members linker-warning

让我们说说由于某种原因,我想要一个带有一些静态数据成员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

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

谢谢你们的帮助!

0 个答案:

没有答案