C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 使用函数返回不完整类型作为默认参数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当我尝试编译并运行此代码时(只有前三行真正重要):

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(){}

我收到此错误

@H_575_7@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; ^

如何在不改变所有内容的顺序的情况下编译它?在我的实际代码中,声明在一起,而定义分布在几个文件中.是否可以在不分离声明的情况下解决问题?

如果在这个阶段类型不完整,为什么重要?

解决方法

您不必更改所有内容的顺序,但您确实需要更改某些内容的顺序.特别是,必须在调用getObject之前定义对象(在认参数表达式中).

这有点不清楚这意味着什么,但是如果你在顶部定义对象,那么声明可以保持与你的例子完全一样.

一个选择是在对象定义后使用认参数重新声明该函数

class object;
object getObject();
void doSomething(object o);

class object{
    public:
        int num = 0;
};

void doSomething(object o = getObject());

这当然意味着第一次声明后的代码,但在重新声明之前不会受益于认参数.

最后,有点诡计.在模板实例化之前,模板中的表达式不需要完整,因此如果doSomething是函数模板,那么您的示例将正常工作:

template<class T=void>
void doSomething(object o = getObject());

class object{};

object getObject(){
    return {};
}

template<class T>
void doSomething(object o){}

当然,您不应该只是为了解决这个问题而制作模板,但这是一个在编写模板时需要注意的便细节.

大佬总结

以上是大佬教程为你收集整理的c – 使用函数返回不完整类型作为默认参数全部内容,希望文章能够帮你解决c – 使用函数返回不完整类型作为默认参数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。