Я реализую класс 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: добавлен полный код для минимального рабочего примера. Благодарю!
Синтаксис 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);
explicit
?