Я работаю над некоторым кодом, который компилирует и связывает (и даже выпускает коммерческие продукты) в Windows с использованием MSVC. Она не компилируется с GCC, хотя, я получаю следующие ошибки:C++ templated function and forward declarations
.../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.
Я подозреваю, что шаблоны - это красная селедка. Можете ли вы снять шаблон и подтвердить, что это все еще проблема? –
Есть ли причина, по которой вы не можете переместить определение 'CBaseValue :: InstanceOf' в' CValueType.h' после определения 'class CValueType'? –
К сожалению, я не могу вытащить шаблоны - это шаблонная функция, на которой основана вся система типов (внутри нашего движка). По этой причине я также не могу (не меняя много кода) переместить функцию из CBaseValue и в CValueType. – user438380