我专门设计了一个模板,并在MSVC编译器和MinGW/GCC之间遇到了不同的beahviour。这里是头文件:模板专业化 - MSVC和GCC/MinGW之间的不同行为
// MyClass.h
#ifndef MYCLASS_HEADER
#define MYCLASS_HEADER
template<typename T>
class MyClass {
public:
virtual void doSomething() {
// some code
}
};
// specialization prototype here
#endif
现在,区别。为了避免多个定义,我只在头文件中专门设计了一个原型,实现在一个cpp文件中。专业化是问题。海湾合作委员会/ 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编译器抛出一个“无法解析的外部符号”错误,GCC与MSVC版本抛出“专业化......实例化后”。
目前,我有解决方法:
#ifdef _MSC_VER
extern template
#else
template<>
#endif
void MyClass<int>::doSomething();
在头文件。它有效,但我不喜欢它。有没有办法避免编译器特定的开关?
您使用的是什么版本的MSVC和GCC? – Gonmator
MSVC 2010 SP1和GCC 4.7 – WoJo