Шнуровка скомпилировать следующую программу с Visual Studio 10, я получаю много ошибок компиляции:Проблема с станд :: make_tuple в C++ 0x
#include "stdafx.h"
#include <tuple>
#include <string>
#include <map>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
typedef std::tuple<std::string, std::string> key_t;
typedef std::map<key_t, std::string> map_t;
map_t the_map;
auto k = std::make_tuple("one", "two");
the_map[k] = "the value";
auto q = std::make_tuple("one", "two");
auto i = the_map.find(q);
std::cout << i->second << std::endl;
return 0;
}
Ошибка 1 Ошибка C2664: «зЬй :: basic_string < _Elem, _Traits, _Ax> :: basic_string (const std :: basic_string < _Elem, _Traits, _Ax> &) ': невозможно преобразовать параметр 1 из' const key_t 'в' const std :: basic_string < _Elem, _Traits, _Ax > & 'c: \ program files (x86) \ microsoft visual studio 10.0 \ vc \ include \ tuple 127 1 кортеж
Исходя из линии:
std::cout << i->second << std::endl;
Странная вещь есть, как минимум, с моей точки зрения, если я меняю эти строки:
auto k = std::make_tuple("one", "two");
the_map[k] = "the value";
в
the_map[std::make_tuple("one", "two")] = "p";
в компиляции программ. Итак, мой вопрос, конечно, почему? Я предполагаю, что это что-то делать с make_tuple и двигаться семантику - но я не понимаю, что ..
Спасибо - это работает, и мой оригинальный код будет выглядеть хорошо с вашим исправлением. – baardk
Обратите внимание, что вы также можете написать 'the_map [std :: move (k)] =" значение "', но это «уничтожит» вашу переменную 'k' (посмотрите на некоторые статьи о семантике перемещения, если вы не видите, что Я имею в виду уничтожить). – Tomaka17
Ницца. Я опубликовал проблему на каком-то сайте MS connect, поэтому они могут проверить, является ли это ошибкой или чем-то. – baardk