繁体   English   中英

为什么定义一个带有返回类型作为其类的方法不会使我出现“不完整类型”错误

[英]why defining a method with a return type as its class won't get me an 'incomplete type' error

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

class A; 

//转发声明,将A设置为不完整的类型

A foo(){...} 

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

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

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

它工作得很好。

我认为在类的定义中定义方法时,类仍然是不完整的类型。 因此,我认为它会提示类似于前者的错误,但事实并非如此。 有人知道为什么吗?

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

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

template <typename T> struct base {};

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

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

编辑:有关此行为的C ++标准的相关部分,请参见Mike Seymour的以下内容。

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

最好为B的一个成员函数声明B的返回类型,即使B当时在C ++ 11 8.3.5 / 9中指定为不完整:

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

实例化类型为B的对象以在函数体中返回也可以; 在类定义中,按照C ++ 11 9.2 / 2的规定,该类在各种上下文(包括函数体)中都被视为完整的:

在类成员规范中 ,该类被视为完整的函数体 ,默认参数, 异常规范以及非静态数据成员(包括嵌套类中的此类内容)的花括号或相等初始化器 否则,在其自己的类成员规范内,它被视为不完整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM