Я пытаюсь перенести свою собственную библиотеку из Visual Studio на g ++ в GNU / Linux, и у меня возникают некоторые проблемы с компиляцией шаблонов. Действительно, в Visual C ++ шаблоны генерируются только тогда, когда они явно используются в коде, в то время как (из моих ошибок) кажется, что g ++ оценивает содержимое шаблонов перед их первым использованием. Это приводит к следующей ошибке:
error: incomplete type ‘X’ used in nested name specifier
... потому что я включаю некоторые классы после кода шаблона, а не до. Я делаю это из-за конфликта между пользователями.
Подводя итог, кажется, что Visual C ++ не пытается разрешить содержимое шаблонов при использовании, а g ++ выполняет разрешение как можно скорее.
class MyClass;
template<class _Ty>
void func(MyClass* a_pArg)
{
a_pArg->foo();
};
(_ Тай не используется, но это не имеет значения, это просто для объяснения проблемы)
В этом случае Visual C ++ будет компилироваться (даже если MyClass
не объявлен заранее), а g ++ - нет, поскольку MyClass
не был полностью объявлен.
Есть ли способ заставить g ++ создавать шаблоны только при использовании?