我在这里做一些基于策略的设计,我需要输入大量的模板类型来缩短名称。
现在的问题是,当我需要使用指向其中一种类型的指针时,我尝试只是向前声明它,但编译器抱怨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;
任何提示?
答案 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'。
我真的很感谢你对这个案子的帮助。
注意:顺便说一下,我在这里发布了这个问题,因为我认为这几乎是一回事,为了不分散社区的注意力。