Конструктор копирования c ++: компилятор не может найти его при использовании a = b

0

Я реализую класс 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&)'".

Что здесь может быть неправильным?

EDIT: добавлен полный код для минимального рабочего примера. Благодарю!

  • 1
    Вы должны опубликовать MCVE
  • 5
    ваш copy-ctor explicit ?
Показать ещё 4 комментария
Теги:
c++11
copy-constructor

2 ответа

3

Синтаксис 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);

если вы хотите использовать конструктор копирования, используя синтаксис инициализации копирования.

-1

На самом деле это вызов оператора присваивания копий, а не конструктора копирования.

Вы можете сделать это, указав void Vector::operator=(const Vector& param);

  • 0
    Vector & Vector :: operator = (const Vector & param); Так что цепочка назначений может быть реализована. а = б = с;
  • 4
    Нет, оператор присваивания здесь не вызывается. Посмотрите на сообщение об ошибке - он явно выбрал конструктор для вызова.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню