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

时间:2010-02-14 22:44:39

标签: 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;

任何提示?

3 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:2)

typedef Test Test1;
class Test1;

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

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

例如,如果要对Test1使用前向声明,则必须使用该typedef将typedef作为前向声明放在每个文件中。因此,您需要执行以下操作:

,而不是class Test1;
class Test;
typedef Test Test1;

答案 2 :(得分:2)

出现这种情况的另一个案例是:

// File: network_fwd.hpp
#ifndef __NETWORK_FWD_HPP__
#define __NETWORK_FWD_HPP__
class Network;
typedef Network GarnetNetwork;
#endif // __NETWORK_FWD_HPP__

// File: network.hpp
#include "network_fwd.hpp"

class GarnetIntLink : public BasicLink
{
  public:

    friend class GarnetNetwork;

};

我必须这样做,因为实际上有一个名为GarnetNetwork的类我合并到了类Network中,我希望使用该typedef在其余的代码中传播它。 GCC仍然提供以下消息:错误:在“课程”之后使用typedef-name'GarnetNetwork'。

我真的很感谢你对这个案子的帮助。

注意:顺便说一下,我在这里发布了这个问题,因为我认为这几乎是一回事,为了不分散社区的注意力。

相关问题