C++ 复制构造函数c++;:编译器可以';当使用a=b时,找不到它
我正在实现一个C++ 复制构造函数c++;:编译器可以';当使用a=b时,找不到它,c++,c++11,copy-constructor,C++,C++11,Copy Constructor,我正在实现一个Vector类。这些是我的源文件 vector.h #ifndef VECTOR_H #define VECTOR_H class Vector { public: Vector(); explicit Vector(const Vector& src); }; #endif // VECTOR_H vector.cpp #include "vector.h" Vector::Vector() { } Vector::Vector(const Ve
Vector
类。这些是我的源文件
vector.h
#ifndef VECTOR_H
#define VECTOR_H
class Vector
{
public:
Vector();
explicit Vector(const Vector& src);
};
#endif // VECTOR_H
vector.cpp
#include "vector.h"
Vector::Vector()
{
}
Vector::Vector(const Vector &src)
{
}
以及测试程序,main.cpp
#include "vector.h"
int main()
{
Vector a; // calls default constructor
Vector b(a); // calls copy-constructor, compiles and works fine
Vector c = a; // should call copy-constructor, but does not compile
return 0;
}
编译时,我遇到以下错误:“没有用于调用‘Vector::Vector(Vector&)’的匹配函数”
这里会出什么问题
编辑:添加了最小工作示例的完整代码。
谢谢 实际上调用的是复制赋值运算符,而不是复制构造函数
您可以通过定义void
Vector::operator=(const-Vector¶m)来创建一个代码>语法向量c=a您正在使用的代码称为复制初始化:
§8.5初始化者[dcl.init]
/p15
表单中发生的初始化
T x = a;
与参数传递、函数返回、引发异常(15.1)、处理异常(15.3)和聚合成员初始化(8.5.1)一样,都称为复制初始化。
问题是,您的副本构造函数被标记为显式的:
§12.3.1按构造函数转换[class.conv.ctor]
/p2
显式构造函数与非显式构造函数一样构造对象,但仅在
直接初始化语法(8.5)或显式使用强制转换(5.2.9、5.4)的地方
什么是直接初始化
§8.5初始化者[dcl.init]
/p16
表单中发生的初始化
T x(a);
T x{a};
以及在新表达式(5.3.4)、静态转换表达式(5.2.9)、函数表示法类型转换中
(5.2.3),基本和成员初始值设定项(12.6.2)称为直接初始化。
请从以下位置更改副本构造函数声明:
explicit Vector(const Vector& src);
进入:
如果您想使用复制初始化语法使用复制构造函数。您应该发布一个is-your-copy-ctorexplicit
?是的,您的复制构造函数可能是explicit
。你能给我们展示一个最小的工作示例吗?我同意,这种明确性使得调用复制构造函数是不可能的。继续Piotr并回答此问题谢谢您的评论!我已经编辑过了,够了吗?Vector&Vector::operator=(const Vector¶m);这样就可以实现分配链。a=b=c;否,此处未调用赋值运算符。查看错误消息-它显然选择了要调用的构造函数。
Vector(const Vector& src);