Ошибка С++ при добавлении объектов в вектор

Я новичок в векторах. Я пытаюсь добавить объекты в вектор. Но программа не может скомпилироваться, потому что у меня проблема в коде. Но я не знаю, что это такое. Ошибка:

error C2664: 'void std::vector<_Ty>::push_back(_Ty &&)' : cannot convert parameter 1 from 'Line (void)' to 'Line &&'

Код такой:

Line help_line ();
cin >> ln_quan;
vector <Line> figure_line;
for (int i = 0 ; i < ln_quan ; i++)
{
    figure_line.push_back(help_line);
}

Компилятор говорит, что ошибка в 6-й строке (figure_line.push_back(help_line);).

Я отказался от попыток найти учебник, объясняющий, как добавлять объекты (я легко сдаюсь, когда делаю такие вещи...).

И что означает «Строка (пусто)» и «Строка &&»? Является ли «Линия (пустая)» классом «Линия»? Если да, то что означает «(пусто)» в данном случае?


person AlexSavAlexandrov    schedule 21.12.2011    source источник


Ответы (3)


Line help_line ();

Это не означает, что "help_line должен быть экземпляром Line, созданным с помощью конструктора по умолчанию". Это означает, что "help_line должна быть функцией, реализованной где-то еще, которая не принимает аргументов и возвращает экземпляр Line".

То, что вам нужно, пишется Line help_line; без скобок.

Итак, вы получаете следующее сообщение об ошибке:

'void std::vector<_Ty>::push_back(_Ty &&)' : cannot convert parameter 1 from 'Line (void)' to 'Line &&'

Line && — это тип параметра, который ожидает push_back. && здесь не имеет значения; для начинающих это лучше всего рассматривать как своего рода соглашение о вызовах. Вы по-прежнему просто передаете Line, потому что это то, что вы собираете в векторе Lines.

Line(void) - это "тип функций, которые не принимают аргументов и возвращают экземпляр Line". (void) — это еще один способ записи () для аргументов функции (это не рекомендуется в новом коде, но иногда необходимо при взаимодействии с очень старым кодом C).

person Karl Knechtel    schedule 21.12.2011

Line help_line ();

Это объявляет функцию, а не Line. Вместо этого используйте Line help_line;.

См.: Самый неприятный анализ: почему A a(()); работать?

person Peter Alexander    schedule 21.12.2011
comment
За исключением того, что это более простой случай, чем то, что обычно считается самым неприятным разбором. - person Karl Knechtel; 22.12.2011
comment
@Karl: Разве не все случаи, когда объявление переменной интерпретируется как объявление функции, известны как неприятный разбор? - person Oliver Charlesworth; 22.12.2011
comment
Я думаю, что @Karl прав - насколько я понимаю, самым неприятным синтаксическим анализом будет что-то вроде Line help_line(Line());, где аргументы конструктора вызывают неоднозначность. - person ildjarn; 22.12.2011
comment
Можем ли мы согласиться на довольно неприятный анализ? :-) - person Peter Alexander; 22.12.2011

Вы объявили help_line как функцию, не принимающую параметров и возвращающую Line. Это то, что вы намеревались?

Если это так, вам нужно вызвать функцию, например:

Line help_line();
...
figure_line.push_back(help_line());

Если нет, и вы намеревались объявить help_line как объект типа Line, вам нужно это:

Line help_line;
...
figure_line.push_back(help_line);
person Robᵩ    schedule 21.12.2011