Ошибка при записи в std::map<std::string, boost::variant<>>

166
30 апреля 2019, 22:00

Создал map

std::map<std::string, std::vector<boost::variant<std::string, int, double>>> outputData;

и вектор

std::vector<double> ValDbl;

и когда пытаюсь записать

outputData.insert("123", ValDbl);

получаю ошибку С2664

C2664 "std::_Tree_iterator>> std::_Tree,std::allocator>>,_Pr,_Alloc,false>>::insert(std::_Tree_const_iterator>>,const std::pair,std::allocator>>> &)": невозможно преобразовать аргумент 1 из "const char [4]" в "const std::_Tree_const_iterator>>"

подскажите что я делаю неправильно? ведь variant<...> автоматически должен выбирать тип.

Answer 1

Мне кажется, вы неправильно понимаете концепцию boost::variant.
В вашем случае std::vector<boost::variant<std::string, int, double>> будет содержать не значения определенного типа, а значения типов, указанных в variant

Т.е. выглядеть это будет так:

#include <map>
#include <string>
#include <vector>
#include <iostream>
#include <boost/variant.hpp>
int main ()
{
  typedef boost::variant <std::string, int, double> TVariant;     
  typedef std::vector<TVariant> TVariantVector;
  typedef std::map<std::string, TVariantVector> TMySuperMap;
  std::string key = "123";
  TVariantVector ValDbl;
  TMySuperMap outputData; 
  outputData.insert(TMySuperMap::value_type(key, ValDbl));
  TVariantVector& vec = outputData[key];
  vec.push_back(0.1);
  vec.push_back(1);
  vec.push_back("my_string");
  for (auto& item: vec)
    std::cout << item << std::endl;   
  return 0;
}

https://www.onlinegdb.com/BJsquLZ0Q

READ ALSO
Как изменить название окна программы в Qt

Как изменить название окна программы в Qt

Столкнулся с такой проблемойХочу поменять название окна программы с MainWindow на своё

215
Выведет ли Hello, World!?

Выведет ли Hello, World!?

Гарантировано ли стандартом, что этот код выведет в консоль (устройство вывода - консоль, а не какое-то другое) следующую строку?

145
Как работает VLA?

Как работает VLA?

В чем особенность данной реализации (C99)?

141
Чтение из файла чисел размером около 2 гб

Чтение из файла чисел размером около 2 гб

Условие задачи таково, что сумма двух первых чисел может быть равна чуть меньше 2*(10^9), те

160