7

我在这里做一些基于策略的设计,我需要 typedef 很多模板类型来缩短名称。
现在问题来了,当我需要使用指向其中一种类型的指针时,我尝试只前向声明它,但编译器抱怨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;

有什么提示吗?

4

3 回答 3

17

这是正确的。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;

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

于 2010-02-14T22:49:38.027 回答
2
typedef Test Test1;
class Test1;

失败,因为该typedef语句用作 Test1 类型的声明。

基本上,当编译器看到 typedef 时,它会记住 Test1 是 Test 的同义词。然后,当它看到 时class Test1;,它认为您正在声明一种新类型。但它不能将其视为声明,因为名称 Test1 已被 typedef 使用。

例如,如果要对 Test1 使用前向声明,则必须将 typedef 放入每个文件中,使用该 typedef 作为前向声明。因此,而不是class Test1;,你会这样做:

class Test;
typedef Test Test1;
于 2010-02-14T22:50:15.490 回答
2
于 2012-05-07T18:41:52.327 回答