2010-06-06 2 views
1

Возможно ли следующее:Рекурсивный typedef

typedef Foo<Bar> Bar; 

Мой компилятор жалуется, что «классная панель» имеет предыдущее объявление как «классная панель».

+2

Почему было бы разумно сделать это? –

+1

Рассмотрим машину состояний, где каждая функция состояния возвращает указатель на следующую выполняемую функцию. Типы таких функций являются рекурсивными. Вы можете выразить это с помощью классов (struct StateFunction {StateFunction operator() (void * context);};), но не с, скажем, сырыми функциями или typedefs. – DrPizza

ответ

5

Что вы делаете, это эквивалентно:

struct A {}; 
struct B {}; 
typedef A B; 

, не удивительно это не законно.

+1

Typedefs и классы не находятся в разных пространствах имен на C++, поэтому это не является законным в C++. –

2

Если Bar является классом в качестве параметра шаблона для Foo, он не может быть типизированным Foo<Bar> в то же время.
Вы должны были бы обновить Bar, сначала как отдельный класс, а затем как экземпляр шаблона, но даже typedef Foo<Whatever> Bar; не работал бы, если вы уже объявили Bar как класс.

Смежные вопросы