Ошибка конструктора копии при инициализации вектора объектов, типизированных пользователем - PullRequest
0 голосов
/ 28 ноября 2018

Класс Foo имеет только конструктор по умолчанию и конструктор копирования.Вектор размером 10, инициализированный объектом типа Foo, как-то неверно.

#include <iostream>
#include <vector>

class Foo
{
    public:
        Foo() = default; // Error1
        Foo(Foo& foo) {  // Error2
            std::cout << "copied" << std::endl;
        }

};

int main( void )
{
    Foo f;
    std::vector<Foo> vec(10, f); // Error3
    return 0;
}

В приведенном выше примере кода есть 3 ошибки:

Ошибка1: Конструктор-кандидат недопустим: требуется 0 аргументов, но предоставлено 1

Ошибка2: Конструктор-кандидат недопустим: 1-й аргумент ('const Foo') потеряет квалификатор const

Ошибка3: в экземпляре функции-члена 'std ::__1 :: vector> :: vector 'запрашивается здесь

Когда я удаляю конструктор копирования или вектор в основной функции, ошибок нет.

Вопрос:

Какая часть кода неправильная и почему?

ps

Когда определение вектора заменено на Foo ff(f), ошибки также исчезают.Является ли квалификатор const запросом вектора?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Используемый вами конструктор: std :: vector :: vector (2)

vector( size_type count, 
                 const T& value,
                 const Allocator& alloc = Allocator());

Параметр value, который будет скопирован внутриКонструктор является const, и поскольку ваш конструктор копирования не может копировать из const, реализация конструктора не может создавать копии для заполнения вектора.

0 голосов
/ 28 ноября 2018

Документация конструктора std::vector показывает следующую подпись:

explicit vector (size_type n, const value_type& val = value_type(),
             const allocator_type& alloc = allocator_type());

Это показывает, что требуется val, чтобы быть ссылкой const.Поскольку он, скорее всего, не сократит это const при внутренней обработке, похоже, что val передается в конструктор копирования.Поскольку конструктор копирования Foo ожидает, что для передачи не-1011 * ссылка val потеряет свой квалификатор const.Поскольку это не разрешено, компилятор вызывает ошибку

Ошибка: конструктор-кандидат недопустим: 1-й аргумент ('const Foo') потеряет квалификатор const

0 голосов
/ 28 ноября 2018

Посмотрите на сигнатуру вызванного конструктора std::vector:

vector(size_type n, const T& value, const Allocator& = Allocator());

Аргумент f передается по константной ссылке (параметр value).Поэтому этот параметр нельзя привязать к неконстантному параметру foo типа Foo& конструктора копирования Foo.


Тот же (более простой) случай:

Foo f;
const Foo& value = f;
Foo& foo = value;  // error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...