Разрешено ли следующее?
typedef Foo<Bar> Bar;
Мой компилятор жалуется на то, что у класса Bar ранее было объявление как класс Bar.
То, что вы делаете, эквивалентно:
struct A {}; struct B {}; typedef A B;
, что не удивительно, не является законным.
Если Bar является классом в качестве параметра шаблона для Foo, он не может быть одновременно определен как Foo<Bar>. Вы бы изменили обозначение Bar, сначала как отдельный класс, а затем как экземпляр шаблона, но даже typedef Foo<Whatever> Bar; не будет работать, если вы уже объявили Bar как класс.
Foo<Bar>
typedef Foo<Whatever> Bar;
Нет, это не разрешено.