Я пытаюсь создать вложенный класс, который также является подклассом его родителя:
struct X { struct Y : public X {}; };
К сожалению, это, похоже, не разрешено в С++, так как g++ создает ошибку
error: недопустимое использование неполного типа 'struct X'
Однако мой фактический код имеет X
в качестве шаблона:
template<typename T> struct X
{ struct Y : public X {}; };
Я получаю одно и то же сообщение, но на этот раз это только предупреждение:
предупреждение: недопустимое использование неполного типа 'struct X <T> '
Мой вопрос: почему первый случай является незаконным, в то время как шаблонный случай просто дает предупреждение? Шаблонная версия работает точно так, как я ожидал бы (я могу создавать экземпляры X<T>::Y
, отбрасывать их на X<T>
и т.д.), Но означает ли это предупреждение, что я не должен его использовать? С какими проблемами я могу столкнуться, если игнорировать предупреждение?