将c-函数默认参数设为不完整类型,这种做法合理吗?

2026-04-16 19:233阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计579个文字,预计阅读时间需要3分钟。

将c-函数默认参数设为不完整类型,这种做法合理吗?

当代码尝试编译并运行此现代代码时(仅前三行至关重要):

javaclass object;object getObject();void doSomething(object o=getObject());

以下是对代码的简化改写,不超过100字:

javaclass obj;obj getObj();void act(obj o=getObj());

当我尝试编译并运行此代码时(只有前三行真正重要):

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之前定义对象(在默认参数表达式中).

将c-函数默认参数设为不完整类型,这种做法合理吗?

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

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

本文共计579个文字,预计阅读时间需要3分钟。

将c-函数默认参数设为不完整类型,这种做法合理吗?

当代码尝试编译并运行此现代代码时(仅前三行至关重要):

javaclass object;object getObject();void doSomething(object o=getObject());

以下是对代码的简化改写,不超过100字:

javaclass obj;obj getObj();void act(obj o=getObj());

当我尝试编译并运行此代码时(只有前三行真正重要):

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之前定义对象(在默认参数表达式中).

将c-函数默认参数设为不完整类型,这种做法合理吗?

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

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