![](/img/trans.png)
[英]Error: return type 'class Polar' is incomplete, invalid use of type 'polar'
[英]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.