我在这里做一些基于策略的设计,我有需要的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”“类”

后。

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

注:通过我在这里张贴了这个问题,因为我认为这几乎是同样的事情,为了不分散的社区的方式

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top