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-ctor
explicit
?是的,您的复制构造函数可能是
explicit
。你能给我们展示一个最小的工作示例吗?我同意,这种明确性使得调用复制构造函数是不可能的。继续Piotr并回答此问题谢谢您的评论!我已经编辑过了,够了吗?Vector&Vector::operator=(const Vector¶m);这样就可以实现分配链。a=b=c;否,此处未调用赋值运算符。查看错误消息-它显然选择了要调用的构造函数。
Vector(const Vector& src);