"在前向声明中使用typedef-name ... as class"

Yog*_*gur 6 c++ compiler-construction typedef forward-declaration

我在这里做一些基于策略的设计,我需要输入大量的模板类型来缩短名称.
现在的问题是,当我需要使用指向其中一种类型的指针时,我尝试只是向前声明它,但编译器抱怨test.cpp:8: error: using typedef-name ‘Test1’ after ‘class’
它与尺寸无关,因为我根本不需要obj,它只是一个".h"文件中的指针,我不想把整个模板带进去.
这是g ++:

//Works
class Test{};
class Test;

//Doesn't work
class Test{};
typedef Test Test1;
class Test1;
Run Code Online (Sandbox Code Playgroud)

任何提示?

Joh*_*itb 16

那是对的.typedef-name不能用在这样的前向声明中(这在技术上称为详细类型说明符,如果这样的说明符解析为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;
Run Code Online (Sandbox Code Playgroud)

然后你可以使用那个头而不是做class Test1,编译器不知道它是什么(并且会认为它是一个新类,独立于任何模板和typedef).

  • 好吧,问题出现在.cpp文件中,该文件包含第二个.h文件和带有typedef的原始文件.我需要前向声明,因为我需要声明一个指向该类的指针,并希望避免包含模板文件(带有typedef).这样的事情没有解决办法吗? (2认同)