Чтобы определить эти два класса "typedef map <C, B :: iterator> A; typedef list <D, A :: iterator> B"? - PullRequest
2 голосов
/ 07 марта 2012

Чтобы определить эти два класса

typedef map<C, B::iterator> A;
typedef list<D, A::iterator> B;

Класс A и B взаимно содержат итераторы друг друга. Компилятор жалуется на приведенное выше утверждение. Как решить проблему?

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

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Вы не можете сделать это, используя просто typedefs.

Подставляя B для его typedef:

typedef map<C, B::iterator> A;
typedef list<D, A::iterator> B;

становится:

typedef map<C, list<D, A::iterator>::iterator> A;
typedef list<D, A::iterator> B;

Затем подставляя A для его typedef:

typedef map<C, list<D, map<C, list<D, A::iterator>::iterator>::iterator>::iterator> A;
typedef list<D, A::iterator> B;

Эта замена будет длиться вечно, без свертывания ...

edit: Я должен отметить, что если вы создадите классы-обертки вокруг карты и списка, вы можете объявить классы вперед.

1 голос
/ 07 марта 2012

К сожалению, невозможно .
A и B являются взаимозависимыми, поэтому по крайней мере один из них должен быть заранее объявлен для поддержки другого.
Но типы typedef не могут быть заранее объявлены как class/struct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...