/* 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
Я не знаю, почему это не сработает - есть идеи?
У вас нет конструктора по умолчанию в вашей структуре, потому что вы добавили конструктор не по умолчанию. Вы можете добавить обратно свой конструктор по умолчанию.
Но строка ошибки на самом деле является вашей инициализацией (количеством элементов), это попытка по умолчанию построить item
s с помощью 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
созданными по умолчанию Item
s.
Вместо этого вам нужно написать просто:
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);