复制构造函数 c++:编译器在使用 a = b 时找不到它
Copy-constructor c++: compiler can't find it when using a = b
我正在实现一个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);
来创建一个
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 找不到QtResource文件中的文件
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 找不到以下加速库:boost_fiber
- 找不到 FLTK(缺少:FLTK_INCLUDE_DIR)
- 设置 Visual Studio for MPI: 找不到标识符错误
- "assimp/config.h"找不到,但它在文件夹中
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- C++系统找不到指定的文件错误
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- vcpkg 添加新库,但找不到
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 找不到Linux Visual Studio代码C++文件