我专门设计了一个模板,在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)
在头文件中.它有效,但我不喜欢它.有没有办法避免编译器特定的开关?