Ниже приведен код, который добавляет элементы в вектор, содержащий std::pair.
std::vector<std::pair<std::string, std::type_index>> args_;
template <class T>
inline OperationEntry& setArg(const std::string& name)
{
args_.push_back({name, typeid(T)});
return *this;
}
Как мне добавить элементы в вектор, содержащий std::tuple?
std::vector<std::tuple<std::string, std::type_index, Attribute>> args_;
template <class T>
inline OperationEntry& setArg(const std::string& name, Attribute value = Attribute())
{
args_.push_back({name, typeid(T), value});
return *this;
}
Пробовал args_.push_back(std::make_tuple(name, typeid(T), value));
Я получаю эту ошибку:
[GCC] converting to
‘std::vector<std::tuple<std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >, std::type_index,
mv::Attribute> >::value_type {aka
std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >, std::type_index, mv::Attribute>}’ from
initializer list would use explicit constructor ‘constexpr std::tuple<
<template-parameter-1-1> >::tuple(_UElements&& ...) [with _UElements =
{const std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, const std::type_info&, mv::Attribute&};
<template-parameter-2-2> = void; _Elements =
{std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >, std::type_index, mv::Attribute}]’
Attribute (потому что я понятия не имею, что это такое), так что, возможно, поэтому. Как всегда, пожалуйста, предъявите свой минимальный воспроизводимый пример. Это не обязательно.
См. Также Почему инициализация = {} не работает для кортежа?





args_.push_back({name, typeid(T), value});
До N4387 конструктор std::tuple, используемый для вышеупомянутой инициализации, безусловно, был explicit, и если он был выбран разрешением перегрузки в инициализации списка копирования, компилятору разрешалось выдавать ошибку.
args_.push_back(std::make_tuple(name, typeid(T), value));
Вышеупомянутый вызов будет пытаться использовать конструктор копирования для экземпляра std::type_info, который не подлежит копированию.
Чтобы создать кортеж в реализации до N4387, используйте emplace_back:
args_.emplace_back(name, typeid(T), value);
или отодвинуть кортеж копируемых типов:
args_.push_back(std::make_tuple(name, std::type_index{typeid(T)}, value));
// ~~~~~~~~~^
N4387 реализован в GCC 6.1: gcc.gnu.org/onlinedocs/libstdc++/manual/status.html
Это не полное сообщение об ошибке.