Указатель на шаблон вперед - PullRequest
6 голосов
/ 24 августа 2009

Мне действительно нужно три утверждения, то есть, как это

class A;
template<class _T> class B;
typedef B<A> C;

для прямого объявления указателя типа шаблона C, например:

C* c = 0;

Я надеялся, что смогу скрыть классы A и B в моем предварительном заявлении, это вообще возможно?

Ответы [ 3 ]

8 голосов
/ 24 августа 2009

Хотя это не совсем то же самое, вы можете сделать это вместо этого:

class C;
C* c = 0;

, а затем позже, в файле реализации, после включения заголовочных файлов для «A» и «B», определите «C» следующим образом:

class C : public B<A> {};

Использование наследования вместо typedef должно работать, если вам нужно только использовать конструктор по умолчанию B .

3 голосов
/ 24 августа 2009

Да, вам нужно. Обратите внимание, что все три строки делают разные вещи. Первый объявляет класс. Второй объявляет шаблон, а третий объявляет typedef-имя. При объявлении typedef-name вы можете использовать разработанный спецификатор типа, такой как «класс A», чтобы назвать класс, не имея его имени в области видимости (с некоторыми неприятными ошибками), - но вы не можете далее свернуть объявление шаблона с помощью объявления typedef.

Я бы не беспокоился о трех строках. Если это необходимо, я бы просто записал их:)

1 голос
/ 24 августа 2009

Я не совсем понимаю ваш вопрос, но код такой:

template<class _T> class B;

незаконно. C ++ резервирует имена, начинающиеся с подчеркивания и заглавная буква для реализации компилятора и библиотеки - вы не можете использовать их в своем собственном коде.

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