【问题标题】:Forward declare possible typedef c++0x前向声明可能的 typedef c++0x
【发布时间】:2011-04-02 04:41:20
【问题描述】:

我从问题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)

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

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

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

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

【问题讨论】:

  • 这还不清楚。那个问题是关于类内的typedef 声明,我想说解决方案是用命名空间替换或扩充类。您不能将任何东西转发声明为其他任何东西,因此不能将 class 转发声明为 typedef。这更像你问的吗?
  • 嗨 Potatoswatter,我试图澄清这个问题。
  • 非常好的库编写者在单独的标头中为客户提供公共类型和转发,因此客户无需手动管理。客户端只包含库的类型标头。这也很好,所以你的库标题没有转发的所有噪音。 forwards 和 typedefs 在编译时不会花费任何成本——只需将公共类型放在那里。

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


【解决方案1】:

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

标准库包含一个由前向声明组成的标头<iosfwd>。您可以采用或调整该约定,例如 "foo_forward.h"

当用户在任何地方为您的类编写前向声明时,他实际上是在为您编写标题。这是一个站不住脚的安排。

【讨论】:

    【解决方案2】:

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

    typedef X Z;
    

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

    当你说

    class X;
    

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 2013-06-02
      • 1970-01-01
      • 2018-08-13
      相关资源
      最近更新 更多