С++ std::vector::emplace_back не компилируется с классом строкового значения

/* Item.h */
struct Item {
    std::string name;

    Item(std::string _name) : name( std::move(_name) ) { }
};

/* main.cpp */
/* ... */
const int amount_of_items = val.size();
std::vector<Item> items(amount_of_items);

for( Json::Value::const_iterator itr = val.begin() ; itr != val.end() ; ++itr ) {
    items.emplace_back( "item_name" );
}

Результат:

/usr/include/c++/8/bits/stl_construct.h:75:7: error: no matching function for call to ‘Item::Item()’
     { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:8: Item.h:8:2: note: candidate: ‘Item::Item(std::__cxx11::string)’   Item(std::string _name) : name( std::move(_name) ) { }   ^~~~ Item.h:8:2: note:   candidate expects 1 argument, 0 provided

Я не знаю, почему это не сработает - есть идеи?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
205
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

У вас нет конструктора по умолчанию в вашей структуре, потому что вы добавили конструктор не по умолчанию. Вы можете добавить обратно свой конструктор по умолчанию.

Но строка ошибки на самом деле является вашей инициализацией (количеством элементов), это попытка по умолчанию построить items с помощью c'tor по умолчанию.

Поэтому я рекомендую вам добавить c'tor по умолчанию:

    Item() = default;

Или инициализировать строкой:

std::vector<Item> items(num_items, std::string(""));

Также ваш конструктор «перемещения» должен использовать r-значение ref && (и, возможно, также явный, поскольку он имеет только один параметр):

    Item() = default;

    //             here
    //               V
    explicit Item(std::string &&_name) : name( std::move(_name) ) { }

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

std::vector<Item> items(amount_of_items);

Вызывается конструктор по умолчанию содержащегося типа: Item. Вы должны либо определить конструктор по умолчанию:

Item() = default

Или используйте один из других конструкторов std::vector, которые не имеют этого требования:

std::vector<Item> items(amount_of_items, {""});

Это утверждение:

std::vector<Item> items(amount_of_items);

требуется конструктор по умолчанию для Item, так как вы попросили компилятор заполнить массив amount_of_items созданными по умолчанию Items.

Вместо этого вам нужно написать просто:

std::vector<Item> items;

так как emplace_back будет увеличивать массив по мере необходимости.

Обратите внимание, что вы можете вызвать items.reserve, если хотите заранее зарезервировать место для своих Item.

Ответ принят как подходящий

Проблема в том, что вам нужен конструктор по умолчанию Item для этой последовательности кода. Конструктор по умолчанию отключен, потому что у вас есть собственный конструктор для Item.

Вы можете включить его, добавив Item()=default;.

Кроме того, у вас есть логическая ошибка: std::vector<Item> items(amount_of_items); инициирует items to amount_of_items конструктивных элементов по умолчанию. Это не то, что вы хотите в соответствии со следующей последовательностью, так как к концу у вас будет удвоенное количество элементов.

Вы должны были написать

std::vector<Item> items;
items.reserve(amount_of_items);

Другие вопросы по теме