【问题标题】:why defining a method with a return type as its class won't get me an 'incomplete type' error为什么定义一个返回类型作为其类的方法不会给我一个“不完整类型”错误
【发布时间】:2013-03-06 20:45:23
【问题描述】:

据我所知,在定义具有对象返回类型的函数时,该类仅处于其前向声明状态,如下所示:

class A; 

//前向声明,将A设置为不完整类型

A foo(){...} 

//错误:A 是不完整的类型 我知道当它具有指向该对象的指针或引用的返回类型时它可以正常工作。

但是当我定义一个返回类型作为其类的方法时:

class B{
  public:
    B foo(){...}
}

效果很好。

我认为在类的定义中定义方法时,类仍然是一个不完整的类型。 所以我认为它会提示类似于前者的错误,但它没有。 有谁知道为什么?

我在这里寻求帮助之前已经搜索了很长时间。 (我的英语不好,所以我的描述可能会让你感到困惑。抱歉。)

【问题讨论】:

  • 这不是一个错误,因为你错了 - B 在它自己的定义中并不完整。它并不是不完整的,因为标准是这样说的(标准是这样说的,否则它会很烦人)。
  • @molbdnilo 我认为 B 是一个不完整的类型,因为当我尝试在 B 类的定义中定义 B 的实例时,我得到了“不完整类型”的错误
  • A 的定义显然不完整。它有哪些成员?但是 B 的定义是完整的。它只有一个函数,叫做foo
  • A没有成员,我刚刚做了那个前向声明
  • 编译器无法知道 A 没有成员,而 B 的定义完全可用。

标签: c++ incomplete-type


【解决方案1】:

在类中定义方法时,该类被视为一个完整类型,否则我们将无法定义内联方法。此外,如果您的 A 类是不完整的类型,那么奇怪的重复模板模式也将不起作用。考虑以下代码:

template <typename T> struct base {};

struct derived : base<derived> {};  // We can use derived here
                                    // without any "incomplete type"
                                    // errors.

换句话说:这就是语言的工作方式。

编辑:有关提及此行为的 C++ 标准的相关部分,请参阅 Mike Seymour 的下文。

【讨论】:

  • 您是说在类中定义方法时,该类被视为完成者类型。这有什么证据吗?
  • 我现在无法访问我的 C++11 标准副本,但我今晚回家后会为您挖掘相关部分。
  • 没问题。希望在这两个答案之间,您可以更好地了解 C++ 的作用/原因。
【解决方案2】:

在大多数情况下,您无法定义返回不完整类型的函数是正确的。但是,规则有一些例外情况,允许在其自己的定义中使用类。

按照 C++11 8.3.5/9 的规定,即使 B 在此时不完整,也可以为其成员函数之一声明返回类型 B

函数定义的参数类型或返回类型不应是不完整的类类型(可能是 cv 限定的)除非函数定义 嵌套在该类的成员规范

也可以实例化B 类型的对象以在函数体中返回;在类定义中,类在包括函数体在内的各种上下文中被认为是完整的,如 C++11 9.2/2 所指定:

在类成员规范中,类在函数体中被认为是完整的、默认参数、异常规范和brace-or-equal-initializers 用于非静态数据成员(包括嵌套类中的此类内容)。否则,它在自己的类中被认为是不完整的 成员规范

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2013-07-21
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多