【发布时间】:2018-12-10 20:39:24
【问题描述】:
当我尝试编译和运行这段代码时(只有前三行很重要):
class object;
object getObject();
void doSomething(object o = getObject());
class object{
public:
int num = 0;
};
object getObject(){
return {};
}
void doSomething(object o){
o.num = 5;
}
int main(){}
我收到此错误:
main.cpp:3:39: error: invalid use of incomplete type 'class object'
void doSomething(object o = getObject());
^
main.cpp:1:7: note: forward declaration of 'class object'
class object;
^
如何在不改变所有顺序的情况下编译它?在我的实际代码中,声明是在一起的,而定义分布在多个文件中。是否可以在不分离声明的情况下解决?
在这个阶段如果类型不完整有什么关系?
【问题讨论】:
-
@demogorgon.net 读取语言标签。 C++ 允许这样的语法。
new object()将是object *,而不是object -
@Ptaq666 你可以声明一个带有不完整类型的对象参数的函数。您只是不能调用返回不完整类型的对象(或具有不完整类型的参数)的函数。这里的问题是默认参数表达式是对此类函数的调用。
-
@user2079303 为什么在这个阶段调用函数?我的困惑是为什么 C++ 在使用 doSomething() 之前需要有一个完整的类型。内存分配了吗?
-
@user2079303,没错,我删除了我的评论。
-
@user4913118
getObject()是一个函数调用表达式。这里的所有都是它的。语言规则根本不允许它在getObject的返回类型完成之前出现。
标签: c++ default-parameters incomplete-type