转发声明可能的typedef c ++ 0x

时间:2011-04-02 04:41:21

标签: c++ c++11 typedef forward-declaration

我从问题Forward declare a class's public typedef in c++的答案中理解,在C ++中向前声明可能是typedef的东西是不可能的。

是否有可能在C ++ 0x中执行此问题?

否则,进行如下更改:

class X {...};
typedef X Z;

class Y {...};
typedef Y Z;

破坏客户端代码。

我认为不应该是这种情况,因为typedef的意思是它们应该使底层类型对客户端透明,因此您可以在不破坏客户端代码的情况下更改实现。

澄清

基本上,我们可以说有两个选项:

class X {...};
typedef X Z; // (1)

OR

class Z {...}; // (2)

我希望能够在客户端代码中执行此操作:

class Z; // Or something of this effect, sadly this fails in the case of (1)

无论Z是typedef还是类(确实应该对客户端透明),该代码无需更改。

2 个答案:

答案 0 :(得分:1)

假设标题包含在用户来源的“头部”,并且他们不会转发声明您的类。如果用户想要一个较轻的标题,请给它们一个。

标准库包含一个由前向声明<iosfwd>组成的标题。您可以采用或改编该惯例,例如"foo_forward.h"

当用户在任何地方为您的班级撰写前瞻性声明时,他基本上都是为您编写标题。这是一种站不住脚的安排。

答案 1 :(得分:1)

typedef为某种类型创建另一个名称。当你这样做

typedef X Z;

你告诉编译器“Z是X的另一个名字”。如果它不知道那时X是什么,那么这个信息就没用了。

当你说

class X;

编译器至少知道X是用户定义的类型,这很有帮助。然后它可以排除X不是可能需要特殊处理的类型之一,例如void*char

C ++ 0x不会改变这一点。