2010-09-28 4 views
7

Je déclare une carte de chaîne à une paire de paires comme suit:Comment insérer une paire de std :: pair dans une autre paire std ::?

std::map<std::wstring, 
     std::pair<std::pair<long, long>, 
        std::pair<long, long>>> reference; 

Et j'initialize comme:

reference.insert(L"First", 
       std::pair<std::pair<long, long>, 
          std::pair<long, long>>(std::pair<long, long>(-1, -1), 
          std::pair<long, long>(0, 0))); 

Cependant, Visual C++ me donne l'erreur « C2664, No constructeur pourrait prendre le type de source, ou la résolution de surcharge du constructeur était ambiguë ". Je suis nouveau à l'aide de modèles et de STL et je ne peux pas dire ce que je fais mal.

+4

S'il vous plaît utiliser de typedef et 'std :: make_pair' pour le rendre lisible. – GManNickG

+0

Je l'ai reformaté pour le rendre un peu plus facile sur les yeux. – egrunin

+0

Au lieu d'imbriquer tous ces 'std :: paires's ne pourriez-vous pas utiliser' std :: tr1 :: tuple'? Boost a aussi une implémentation de tuple. – Praetorian

Répondre

16

Le >>> ne peut pas être analysé correctement (sauf si vous avez un compilateur C++ 0x).

Modification > > >

Ce:

reference.insert("First", 

devrait être:

reference.insert(L"First", 
       ^^^ 

Il y a également une fonction d'utilité pour rendre la construction de paires plus faciles:

std::pair<std::pair<long, long>, std::pair<long, long>>(std::pair<long, long>(-1, -1), std::pair<long, long>(0, 0)) 

Peut-être:

std::make_pair(std::make_pair(-1L,-1L),std::make_pair(0L,0L)) 

Essayez ceci:

reference[L"First"] 
    = std::make_pair(std::make_pair(-1L,-1L),std::make_pair(0L,0L)); 
+0

Merci pour l'aide.J'ai édité ma question pour ajouter le "" à mon wstring pour rendre la question plus facile à "analyser". –

+1

Une meilleure réponse que la mienne, mais notez que l'insertion avec 'reference [clé] = valeur' peut donner un comportement différent à' reference.insert (make_pair (clé, valeur)) '; utiliser '[]' écrasera un élément existant, tandis que 'insert' ne le fera pas. –

2

C++ se confond par la consécutive « > » lorsque vous fermez le modèle tel interprète que l'opérateur de décalage.

Ajouter des espaces entre les modèles de fermeture, changement >>> à>>>

+0

Aussi, le conseil de GMan. – iniju

2

map::insert lui-même prend un seul argument std::pair, plutôt que deux arguments. Vous pouvez ranger le code à l'aide std::make_pair (qui infère les arguments du modèle des arguments de la fonction), pour obtenir quelque chose comme:

reference.insert(std::make_pair("First", 
           std::make_pair(std::make_pair(-1L,-1L), 
               std::make_pair(0L,0L)))); 
0

Il aide à utiliser lors du débogage typedefs ce genre de chose.

// test1.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 

#include <map> 
#include <string> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    typedef std::pair<long, long> ElementType; 
    typedef std::pair<ElementType, ElementType> ValueType; 
    typedef std::wstring KeyType; 
    std::map<KeyType, ValueType> reference; 

    KeyType key = L"First"; 
    reference[key] = ValueType(ElementType(-1, -1), ElementType(0, 0)); 

    return 0; 
} 
+0

Il n'y a pas une telle fonction 'insert()' que l'OP essaie d'utiliser, même si vous "#include ". L'exemple de code que vous avez posté fonctionne et est assez lisible, mais parce que vous avez remplacé le 'insert()', pas à cause de l'inclusion comme vous semblez le dire ... – sth

+0

Si vous supprimez la partie "vous avez juste besoin de' '", ce que je pense est un peu trompeur, je pense que c'est * utile * et le remettrait en cause. – sth

+0

ok, vous l'avez. Je ne sais pas si vous vous rendez compte que vous avez écrit "opérateur [] pour l'insertion dans un code plus facile à lire" dans votre réponse. Comme vous le dites, l'insertion n'existe pas! – ttt

0

Vous pouvez simplifier votre code en créant une fonction d'aide pour créer des paires de paires, analogique à la fonction d'aide std::make_pair qui est disponible dans la bibliothèque standard. En utilisant également les cartes operator[] des résultats d'insertion dans le code plus facile à lire:

template<typename T, typename U, typename V, typename W> 
std::pair< std::pair<T,U>, std::pair<V,W> > make_pair_pair(T t, U u, V v, W w) { 
    // using std::make_pair instead of the constructor for better readability 
    return std::make_pair(std::make_pair(t, u), std::make_pair(v, w)); 
} 

reference[L"First"] = make_pair_pair(1,2,3,4); 
Questions connexes