Это верно. Имя typedef не может использоваться в таком прямом объявлении (это технически называется разработанным спецификатором типа, и если такой спецификатор преобразуется в typedef-name, программа плохо сформирована).
Я не понимаю, зачем вам на самом деле нужно предварительное объявление. Потому что, если у вас уже есть typedef, почему бы просто не использовать этот typedef? Это просто также обозначает этот класс.
Редактировать : Судя по вашему комментарию, вам нужен назначенный заголовок предварительной декларации, почти такой же, как <iosfwd>
. Итак, если ваш шаблон называется Test_Template_Name_Long
, этот заголовок может выглядеть как
TestFwd.h
template<typename A, typename B>
class Test_Template_Name_Long;
typedef Test_Template_Name_Long<int, bool> Test1;
Тогда вы можете просто использовать этот заголовок вместо class Test1
, который компилятор не знает, что это такое (и будет думать, что это новый класс, независимый от любого шаблона и typedef).