C++ 为什么在添加另一个构造函数时会出现此错误?

C++ 为什么在添加另一个构造函数时会出现此错误?,c++,constructor,compiler-errors,C++,Constructor,Compiler Errors,一旦我知道这篇文章属于什么主题,我会很高兴地把它的标题改成更合适的标题 如果我更改引起错误的构造函数的参数,则不会出现错误 仅当我包含确切的构造函数时,才会发生此错误: error: no matching function for call to 'Object::Object(Object)' note: candidates are: Object::Object(Object&) note: Object::Object() 代码: 尝试Obje

一旦我知道这篇文章属于什么主题,我会很高兴地把它的标题改成更合适的标题

如果我更改引起错误的构造函数的参数,则不会出现错误

仅当我包含确切的构造函数时,才会发生此错误:

error: no matching function for call to 'Object::Object(Object)'
note: candidates are: Object::Object(Object&)
note:                 Object::Object()
代码:


尝试Objectconst Object&toCopy{}

您声明了一个不寻常且糟糕的复制构造函数,即通过非常量引用获取参数的构造函数。这是可能的,这意味着不会隐式定义其他复制构造函数。但是,这也意味着您不能从临时值构造副本,因为这些临时值不会绑定到非常量引用

除非您有理由这样做,否则您可能想定义auto_obj:-?,您应该使用参数Object const声明通常的复制构造函数&但请确保正确定义它!,或者完全忽略它,依赖于隐式生成的版本,就像注释掉代码中的行一样;或者在C++11中,可以通过声明ObjectObject const&=default;来默认复制构造函数

请注意,流行的三个规则表示,您不应该定义自己的、非平凡的复制构造函数,或者如果您定义了,那么您还需要一个用户定义的析构函数和赋值运算符。确保您的代码正常。

您遇到的错误

error: no matching function for call to 'Object::Object(Object)'
note: candidates are: Object::Object(Object&)
note:                 Object::Object()
表示编译器正在为类对象寻找合适的复制构造函数。在您的类定义中没有这样的函数:您的版本不能用于绑定临时文件,请参见下文。您可以通过以下方式定义正确的版本:

Object(const Object& orig) {
    // and initialize data here, and return 
}
或者您可以不声明这样的函数,工作版本将自动生成,因此也不会出现错误

注: 您正在尝试定义对象&toCopy{}。这是不正确的,因为对临时对象进行非常量引用意味着您无法在构造函数中使用此临时对象从中创建副本,因为无法将临时对象分配给非常量引用

所以要用不同的方式来表达:

->编译器正在搜索复制构造函数

->查找您的版本

->这个版本告诉我们:我不会这么做

最后:

Object o = o.func();

这不是个好主意。引用尚未构造或已破坏的对象的非静态成员是。将func设为静态,这样就可以像Object::func一样使用,或者在正确构造的对象上调用它。

正如前面许多人所指出的,问题在于,您只定义了一个引用的复制构造函数,但返回了对o.func的调用;是,它只能绑定到右值引用或常量引用,而不能绑定到常规引用

然而,您的代码还有另一个问题,即在o上调用func(此时它是一个尚未初始化的对象)是一个错误。也许您打算实现工厂习惯用法?在这种情况下,我建议您声明Object func;静态,并从对象范围调用它,如下所示:

Object o = Object::func();

我确实包括了它。它让我在发布问题之前将其格式化为代码,因此我在代码顶部添加了。@计算机这是我实际代码的一个非常简化的版本,但问题是,我想知道这个错误的原因是什么,以便我可以将这些知识应用到我的程序中。是的,我注意到,就在我发布我的评论之后;我已经稍微编辑了你的帖子,使其在视觉上明显显示消息和代码都在那里。下次我将这样格式化我的问题,谢谢。对象o=o.func@计算机:那怎么办?哈哈,我尽可能地简化了代码,让人们关注我遇到的错误。谢谢你的解释,但我不喜欢有人告诉我我做了一个糟糕的副本。我应该更改变量名,这样你们就不会试图推断代码的要点,而是推断错误的原因。@KacyRaye:非常感谢,但非常量引用复制构造函数很糟糕。它非常混乱,几乎完全是语义上的误导。你可以让auto_ptr和二十年的开发者ire见证这一点。OP的代码中有很多复制构造函数。只是不合适。事实上,这就是重点。您永远不能没有副本构造函数,但它可以是显式/不可访问/已删除/隐式定义/上述任意组合。
Object o = Object::func();