复制构造函数 c++:编译器在使用 a = b 时找不到它

Copy-constructor c++: compiler can't find it when using a = b

本文关键字:找不到 c++ 构造函数 编译器 复制      更新时间:2023-10-16

我正在实现一个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;
}

编译时,我得到以下错误:"no matching function for call to 'Vector::Vector(Vector&)'"

这里可能出了什么问题?

编辑:添加了一个最小工作示例的完整代码。谢谢

您使用的语法Vector c = a;被称为复制初始化

§8.5初始化程序[dcl.init]/p15

以形式发生的初始化

T x = a;

以及在参数传递、函数返回、抛出异常(15.1)、处理异常(15.3)和聚合成员初始化(8.5.1)中,都被称为复制初始化

问题是,您的复制构造函数被标记为explicit:

§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)、static_cast表达式(5.2.9)、函数表示法类型转换中(5.2.3),基初始化器和成员初始化器(12.6.2)称为直接初始化

请将您的复制构造函数声明更改为:

explicit Vector(const Vector& src);

进入:

Vector(const Vector& src);

如果您想使用复制初始化语法来使用复制构造函数。

这实际上是在调用复制赋值运算符,而不是复制构造函数。

您可以通过定义void Vector::operator=(const Vector& param); 来创建一个