私はテンプレートを特化し、MSVCコンパイラとMinGW/GCCの間に違ったビアビールを見つけました。ヘッダーファイルは次のとおりです。テンプレートの特化 - 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ファイルにあります。専門性が問題です。と
// MyClass.cpp
#include "MyClass.h"
template<> void MyClass<int>::doSomething() {
// some code
}
:
extern template void MyClass<int>::doSomething(); // MSVC version
CPPファイル内の実装はどちらも同じです
:これだけはtemplate<> void MyClass<int>::doSomething(); // GCC version
そしてMSVC:GCC/MinGWのコンパイラはこれだけを受け入れGCCプロトタイプMSVCコンパイラは "未解決の外部シンボル"エラーをスローし、MSVCバージョンのGCCは "インスタンス化後の...の特殊化"をスローします。
瞬間、私は回避策があります:ヘッダファイルに
#ifdef _MSC_VER
extern template
#else
template<>
#endif
void MyClass<int>::doSomething();
を。それは動作しますが、私はそれが好きではありません。コンパイラ固有のスイッチを避ける方法はありますか?
使用しているMSVCとGCCのバージョンは何ですか? – Gonmator
MSVC 2010 SP1とGCC 4.7 – WoJo