
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; ^
如何在不改变所有内容的顺序的情况下编译它?在我的实际代码中,声明在一起,而定义分布在几个文件中.是否可以在不分离声明的情况下解决问题?
如果在这个阶段类型不完整,为什么重要?
解决方法How would I get it to compile without changing the order of everything?
您不必更改所有内容的顺序,但您确实需要更改某些内容的顺序.特别是,必须在调用getobject之前定义对象(在默认参数表达式中).
Is it possible to do solve without separating the declarations?
这有点不清楚这意味着什么,但是如果你在顶部定义对象,那么声明可以保持与你的例子完全一样.
另一个选择是在对象定义后使用默认参数重新声明该函数:
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 – 使用函数返回不完整类型作为默认参数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)