我从问题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还是类(确实应该对客户端透明),该代码无需更改。
答案 0 :(得分:1)
假设标题包含在用户来源的“头部”,并且他们不会转发声明您的类。如果用户想要一个较轻的标题,请给它们一个。
标准库包含一个由前向声明<iosfwd>
组成的标题。您可以采用或改编该惯例,例如"foo_forward.h"
。
当用户在任何地方为您的班级撰写前瞻性声明时,他基本上都是为您编写标题。这是一种站不住脚的安排。
答案 1 :(得分:1)
typedef为某种类型创建另一个名称。当你这样做
typedef X Z;
你告诉编译器“Z是X的另一个名字”。如果它不知道那时X是什么,那么这个信息就没用了。
当你说
时class X;
编译器至少知道X是用户定义的类型,这很有帮助。然后它可以排除X不是可能需要特殊处理的类型之一,例如void*
或char
。
C ++ 0x不会改变这一点。