шаблонное круговое наследование - PullRequest
3 голосов
/ 29 марта 2011

в этом коде компилятор жалуется на undefined MyClassB, что понятно:

class MyClassA;
class MyClassB;

template <class T> class BaseClass : public T {
};

class MyClassA : public BaseClass<MyClassB> {
};

class MyClassB : public BaseClass<MyClassA> {
};

но в этом коде компиляция успешна и не жалуется about MyClassB:

class MyClassA;
class MyClassB;

template <class T> class BaseClass : public T {
};

class MyClassA : public BaseClass<std::vector<MyClassB>> {
};

class MyClassB : public BaseClass<std::vector<MyClassA>> {
};

, почему компилируется второй код, поскольку MyClassB еще не определено при построении std::vector<MyClassB>?

Ответы [ 2 ]

6 голосов
/ 29 марта 2011

Поскольку ваша реализация std::vector допускает неполный тип.Это побочный эффект правил создания функций-членов шаблонов классов: они не создаются, пока не будут использованы.Таким образом, функции, которые делают , нуждаются в полном типе, еще не созданы.Так что никаких ошибок.

Наоборот, для базового класса это должен быть полный тип, так что в этом случае вы получите ошибку.


Однако это фактически неопределенное поведениепередать неполный тип в std::vector (или в любой другой стандартный контейнер библиотеки), и «это работает» - допустимый неопределенный результат.Ты не должен этого делать.

0 голосов
/ 29 марта 2011

Поиск " Любопытно повторяющегося шаблона ".

Ваш BaseClass класс использует свой аргумент шаблона в качестве базового класса, для которого требуется полный тип.

Вторая версия кода просто передает аргумент шаблона другому шаблону, в этом случае допускается неполный тип, если второй шаблон не выполняет ничего, требующего полного типа. Если вы используете аргумент любым способом, который требует полного типа, он также не будет разрешен.

...