首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制构造函数c++:使用a=b时编译器找不到它

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

Stack Overflow用户
提问于 2014-09-12 03:17:41
回答 2查看 210关注 0票数 0

我正在实现一个Vector类。这些是我的源文件。

vector.h

代码语言:javascript
复制
#ifndef VECTOR_H
#define VECTOR_H

class Vector
{
 public:
    Vector();
    explicit Vector(const Vector& src);
};
#endif // VECTOR_H

vector.cpp

代码语言:javascript
复制
#include "vector.h"

Vector::Vector()
{
}

Vector::Vector(const Vector &src)
{
}

测试程序main.cpp

代码语言:javascript
复制
#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&)'"

这里会出什么问题呢?

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

EN

回答 2

Stack Overflow用户

发布于 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.

请将您的复制构造函数声明从:

代码语言:javascript
复制
explicit Vector(const Vector& src);

进入:

代码语言:javascript
复制
Vector(const Vector& src);

如果要通过复制初始化语法利用复制构造函数,请执行以下操作。

票数 3
EN

Stack Overflow用户

发布于 2014-09-12 03:20:53

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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25795442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档