我正在使用 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 的原因。