我专门设计了一个模板,但在 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
现在,区别。为了避免多重定义,我只在头文件中专门设计了一个原型,实现在一个 cpp 文件中。专业是问题。GCC/MinGW 编译器只接受这个:
template<> void MyClass<int>::doSomething(); // GCC version
而MSVC只有这个:
extern template void MyClass<int>::doSomething(); // MSVC version
两者在 CPP 文件中的实现是相同的:
// MyClass.cpp
#include "MyClass.h"
template<> void MyClass<int>::doSomething() {
// some code
}
使用 GCC 原型时,MSVC 编译器会抛出“无法解析的外部符号”错误,使用 MSVC 版本的 GCC 会抛出“实例化后……的特殊化”。
目前,我有解决方法:
#ifdef _MSC_VER
extern template
#else
template<>
#endif
void MyClass<int>::doSomething();
在头文件中。它有效,但我不喜欢它。有没有办法避免编译器特定的开关?