Я работаю над кодом, который компилирует и связывает (и даже выпускает коммерческие продукты) для Windows, используя MSVC. Это не компилируется с 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.