小编WoJ*_*oJo的帖子

模板特化 - MSVC和GCC/MinGW之间的不同行为

我专门设计了一个模板,在MSVC编译器和MinGW/GCC之间遇到了不同的问题.这是头文件:

// MyClass.h
#ifndef MYCLASS_HEADER
#define MYCLASS_HEADER

template<typename T>
class MyClass {
public:
   virtual void doSomething() {
      // some code
   }
};

// specialization prototype here

#endif
Run Code Online (Sandbox Code Playgroud)

现在,差异.为了避免多个定义,我只在头文件中专门设计原型,实现在cpp文件中.专业化是问题所在.GCC/MinGW编译器只接受这一个:

template<> void MyClass<int>::doSomething(); // GCC version
Run Code Online (Sandbox Code Playgroud)

而MSVC只有这个:

extern template void MyClass<int>::doSomething(); // MSVC version
Run Code Online (Sandbox Code Playgroud)

CPP文件中的实现对于两者都是相同的:

// MyClass.cpp
#include "MyClass.h"

template<> void MyClass<int>::doSomething() {
   // some code
}
Run Code Online (Sandbox Code Playgroud)

使用GCC原型,MSVC编译器抛出"未解析的外部符号"错误,GCC与MSVC版本抛出"实例化后......的专业化".

目前,我有解决方法:

#ifdef _MSC_VER
extern template
#else
template<>
#endif
void MyClass<int>::doSomething();
Run Code Online (Sandbox Code Playgroud)

在头文件中.它有效,但我不喜欢它.有没有办法避免编译器特定的开关?

c++ gcc templates mingw visual-c++

5
推荐指数
1
解决办法
2212
查看次数

标签 统计

c++ ×1

gcc ×1

mingw ×1

templates ×1

visual-c++ ×1