我正在实现一个Vector类。这些是我的源文件。
vector.h
#ifndef VECTOR_H
#define VECTOR_H
class Vector
{
public:
Vector();
explicit Vector(const Vector& src);
};
#endif // VECTOR_Hvector.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&)'"。
这里会出什么问题呢?
编辑:添加了最小工作示例的完整代码。谢谢!
发布于 2014-09-12 03:37:18
您正在使用的语法Vector c = a;称为copy-initialization
§8.5初始化程序
[dcl.init]/ p15
表单中发生的初始化
= a;
与参数传递一样,函数返回、抛出异常(15.1)、处理异常(15.3)和聚合成员初始化(8.5.1)也称为copy-initialization.
问题是,您的复制构造函数被标记为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)中也称为direct-initialization.
请将您的复制构造函数声明从:
explicit Vector(const Vector& src);进入:
Vector(const Vector& src);如果要通过复制初始化语法利用复制构造函数,请执行以下操作。
发布于 2014-09-12 03:20:53
这实际上是调用复制赋值运算符,而不是复制构造函数。
您可以通过定义无效的Vector::operator=(const Vector& param);来创建一个
https://stackoverflow.com/questions/25795442
复制相似问题