#include <array>
#include <vector>
#include <cinttypes>
#include <iostream>
using namespace std;
template<size_t N>
struct item_t {
array<uint32_t, N> weight = {0};
};
int main(void) {
vector<item_t<3>> items;
items.emplace_back({{9,2,3}});
cout << items[0].weight[0] << endl;
return 0;
};
Я немного растерялся. Ошибка в строке emplace_back и не знаю, как ее устранить. Любая помощь или советы будут оценены, спасибо.
РЕДАКТИРОВАТЬ
gcc версия 4.8.2
$ g++ -std=c++11 test.cpp
test.cpp: In function ‘int main()’:
test.cpp:16:30: error: no matching function for call to ‘std::vector<item_t<3ul> >::emplace_back(<brace-enclosed initializer list>)’
items.emplace_back({{9,2,3}});
^
test.cpp:16:30: note: candidate is:
In file included from /usr/include/c++/4.8/vector:69:0,
from test.cpp:2:
/usr/include/c++/4.8/bits/vector.tcc:91:7: note: void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {}; _Tp = item_t<3ul>; _Alloc = std::allocator<item_t<3ul> >]
vector<_Tp, _Alloc>::
^
/usr/include/c++/4.8/bits/vector.tcc:91:7: note: candidate expects 0 arguments, 1 provided
Проблема с инициализацией структуры = {0}
и с emplace_back
,
emplace_back()
использует вывод аргумента шаблона для определения типов элементов, передаваемых в функцию. Заключенный в скобки список инициализаторов не является выражением и не имеет типа и поэтому не может быть выведен из шаблона. Вы должны явно вызвать конструктор здесь:
items.emplace_back(item_t<3>{{1,2,3}});
Здесь есть две проблемы:
Попытка инициировать объект типа T
как это T{...}
упоминается как агрегатная инициализация. При некоторых условиях для него задано поведение по умолчанию, даже если у вас нет конструктора, который принимает initializer_list
, В C++11
Вы не можете предоставлять конструкторы не по умолчанию или инициализаторы в классе. Итак, учитывая это определение
template<size_t N>
struct item_t {
array<uint32_t, N> weight = {0};
};
ты не можешь писать item_t<3> t{1,2,3};
,
Это, однако, не ваша проблема. Причина, по которой ваш код не работает, заключается в том, что emplace_back пытается переслать аргументы в конструктор vector
базовый тип. В вашем случае нет совпадения. Обратите внимание, что хороший список фигурных скобок не эквивалентен initializer_list
в этом контексте вы не можете решить эту проблему, добавив initializer_list
конструктор и должен будет помочь компилятору другим способом.