【发布时间】:2013-06-19 15:21:30
【问题描述】:
我专门化了一个模板,并在 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();
在头文件中。它有效,但我不喜欢它。有没有办法避免编译器特定的开关?
【问题讨论】:
-
您使用的是什么版本的 MSVC 和 GCC?
-
MSVC 2010 SP1 和 GCC 4.7
标签: c++ templates visual-c++ gcc mingw