在向前声明“使用的typedef名称...作为类”
-
20-09-2019 - |
题
我在这里做一些基于策略的设计,我有需要的typedef大量的模板类型的缩短名字。结果
现在问题来了,当我需要用一个指针指向这些类型我尝试只是一个前瞻性声明,但编译器与test.cpp:8: error: using typedef-name ‘Test1’ after ‘class’
点击抱怨
这是无关的大小,因为我不需要OBJ可言,它只是在“.H”文件的指针,我不希望把整个模板。点击
这是克++:
//Works
class Test{};
class Test;
//Doesn't work
class Test{};
typedef Test Test1;
class Test1;
任何暗示?
解决方案
这是正确的。甲的typedef-名称不能以这样的前向声明被使用(这是技术上称为一个详细类型说明符,并且如果这样的说明符解析为一个typedef名,是形成不良的程序)。
我不明白为什么你真正的需要的正向摆在首位声明。因为如果你已经到位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)。
其他提示
typedef Test Test1;
class Test1;
因为typedef
语句作为声明为测试1型失败。
基本上,当编译器看到的typedef,它记住测试1是用于测试的同义词。然后,当它看到class Test1;
,它认为有一个新的类型您声明。但由于名字的Test1已经正在使用的typedef不能把它看成一个声明。
如果您要使用Test1的向前声明,例如,你必须使用的typedef作为一个向前声明把typedef的每个文件。因此,与其class Test1;
,你会怎么做:
class Test;
typedef Test Test1;
,其中这种情况下产生的一个更情形是这样的:
// 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我汇成一流的网络,我想在整个代码的其余部分使用的typedef传播。 GCC仍然给出了这样的消息:错误:使用的typedef名“GarnetNetwork”“类” 强>
后。我真的很感谢你对这个案子的帮助。
注:通过我在这里张贴了这个问题,因为我认为这几乎是同样的事情,为了不分散的社区的方式