Tying pour compiler le programme suivant avec Visual Studio 10, je reçois beaucoup d'erreurs de compilation:problème avec std :: make_tuple en 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;
}
Erreur 1 Erreur C2664: « std :: basic_string < _Elem, _Traits, _Ax> :: basic_string (const std :: basic_string < _Elem, _Traits, _Ax> &) ': impossible de convertir le paramètre 1 de' const key_t 'en' const std :: basic_string < _Elem, _Traits, _Ax > & 'c: \ fichiers de programme (x86) \ microsoft studio visuel 10.0 \ vc \ include \ tuple 127 1 tuple
venant de la ligne:
std::cout << i->second << std::endl;
Chose étrange est, du moins de mon point de vue, si je change ces lignes:
auto k = std::make_tuple("one", "two");
the_map[k] = "the value";
à
the_map[std::make_tuple("one", "two")] = "p";
la programme compile. Donc, ma question est bien sûr pourquoi? Je suppose qu'il a quelque chose à voir avec make_tuple et déplacer la sémantique - mais je ne comprends pas ce que ..
Merci - cela fonctionne et mon code d'origine semblera correct avec votre solution. – baardk
Notez que vous pouvez également écrire 'the_map [std :: move (k)] =" la valeur "' mais cela va "détruire" votre variable 'k' (regardez quelques articles sur la sémantique de déplacement si vous ne voyez pas Je veux dire par détruire). – Tomaka17
Nice. J'ai posté le problème sur un site MS Connect, afin qu'ils puissent vérifier s'il s'agit d'un bug ou quoi. – baardk