私は、MSVC を使用して Windows でコンパイルおよびリンクする (さらには商用製品をリリースした) コードに取り組んでいます。ただし、GCC ではコンパイルされません。次のエラーが発生します。
.../CBaseValue.h: In member function 'bool CBaseValue::InstanceOf()':
.../CBaseValue.h:90:18: error: invalid use of incomplete type 'struct CValueType'
.../CBaseValue.h:11:7: error: forward declaration of 'struct CValueType'
CBaseValue.h
class CValueType;
class CBaseValue {
public:
...
template <typename _Type>
bool InstanceOf() {
CValueType* pType = GetType();
if(pType == NULL) {
return false;
}
else {
return pType->IsDerivedFrom<_Type>();
}
}
...
}
CValueType.h
class CValueType : public CBaseValue {
public:
...
template <typename _Type>
bool IsDerivedFrom() {
return IsDerivedFrom(_Type::TYPEDATA);
}
...
}
これが問題である理由を理解しています。基本クラス (CBaseValue) には、派生クラス (この場合は CValueType) を使用するテンプレート化された関数があります。
ここでは、MSVC が C++ 仕様に正確に従っていないように見えます。しかし、テンプレート化された関数を呼び出すコードが実際にコンパイルされるまで前方宣言を使用するという MSVC の動作も、現時点ではより望ましいものです。多くの基本コードを書き直さなくても、このコードを GCC で動作させることができる回避策を知っている人はいますか?
私自身の調査から、「-fno-implicit-templates」を g++ に渡すと役立つように見えますが、呼び出されたテンプレート タイプを明示的に定義する必要があります。それらはたくさんあるので、それを避けることができれば、それを好む. 一般的なコンセンサスがこれが私の最良の選択肢であるということである場合...そうしてください!
誰かが疑問に思っているかもしれませんが、コードを Mac に移植しているので、現在 GCC を使用しています。