Заключенный в скобки список инициализаторов шаблонной структуры

#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,

3

Решение

emplace_back() использует вывод аргумента шаблона для определения типов элементов, передаваемых в функцию. Заключенный в скобки список инициализаторов не является выражением и не имеет типа и поэтому не может быть выведен из шаблона. Вы должны явно вызвать конструктор здесь:

items.emplace_back(item_t<3>{{1,2,3}});
4

Другие решения

Здесь есть две проблемы:

Попытка инициировать объект типа 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 конструктор и должен будет помочь компилятору другим способом.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector