2010-09-28 5 views
7

ich eine Karte von Zeichenfolge zu einem Paar von Paaren wie folgt erklärt:Wie fügt man ein Paar std :: pair in ein anderes std :: pair ein?

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

Und ich initialisieren es als:

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))); 

jedoch Visual C++ gibt mir die Fehlermeldung „C2664, No Konstruktor könnte den Quellentyp verwenden, oder die Auflösung der Konstruktorüberladung war mehrdeutig ".

Ich bin neu mit Vorlagen und STL und ich kann nicht sagen, was ich falsch mache.

+4

Bitte verwenden Sie typedef die und 'std :: make_pair', um es lesbar zu machen. – GManNickG

+0

Ich habe es umformatiert, um es * ein bisschen * einfacher für die Augen zu machen. – egrunin

+0

Anstatt alle diese 'std :: pair's zu verschachteln, könntest du nicht auf' std :: tr1 :: tuple' umschalten? Boost hat auch eine Tupel-Implementierung. – Praetorian

Antwort

16

Die >>> kann nicht richtig analysiert werden (es sei denn, Sie haben einen C++ 0x Compiler).

Wechsel zu > > >

Dieses:

reference.insert("First", 

Sollte sein:

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

Auch gibt es eine Nutzenfunktion, die den Aufbau von Paaren leichter zu machen:

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

sein:

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

Try this:

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

Danke für die Hilfe.Ich habe meine Frage bearbeitet, um das L "" zu meinem wstring hinzuzufügen, damit die Frage leichter "parsen" kann. –

+1

Eine bessere Antwort als meine, aber beachten Sie, dass das Einfügen mit 'reference [key] = value' zu ​​einem anderen Verhalten von reference.insert (make_pair (key, value)) führen kann' '; Mit '[]' überschreiben Sie ein vorhandenes Element, während 'insert' nicht funktioniert. –

2

C++ wird durch die aufeinander folgenden verwirrt ">", wenn Sie die Vorlage zu schließen, wie es interpretiert, dass als Shift-Operator.

hinzufügen Leerzeichen zwischen dem Schließen Vorlagen, ändert >>> zu>>>

+0

Auch GMans Ratschlag. – iniju

2

map::insert selbst ein einziges std::pair Argument, anstatt zwei Argumente. Sie können den Code aufzuräumen von std::make_pair mit (die die Vorlage Argumente aus den Funktionsargumente folgert), so etwas wie zu bekommen:

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

Es hilft typedefs zu verwenden, wenn diese Art der Sache debuggen.

// 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

Es gibt keine solche 'insert()' Funktion, wie das OP versucht zu verwenden, auch wenn Sie '#include '. Der von Ihnen gepostete Beispielcode funktioniert und ist gut lesbar, aber weil Sie das 'insert()' ersetzt haben, nicht wegen des Includes, wie Sie zu sagen scheinen ... – sth

+0

Wenn Sie den "Sie brauchen nur' '" Teil entfernen, was ich denke, ist etwas irreführend, ich würde denken, dass es * hilfreich * ist und es aufwerten würde. – sth

+0

ok, du hast es. Ich weiß nicht, ob Sie wissen, dass Sie in Ihrer Antwort "operator [] für Einfügeergebnisse in Code, der leichter zu lesen ist" geschrieben haben. Wie Sie sagen, einfügen ist nicht vorhanden! – ttt

0

Sie könnten Ihren Code vereinfachen, indem eine Hilfsfunktion zu schaffen Paare von Paaren, analog zu der std::make_pair Hilfsfunktion zu erstellen, die in der Standardbibliothek zur Verfügung steht. Auch mit Hilfe der Karten operator[] zum Einsetzen Ergebnisse in einfachen Code zu lesen:

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); 
Verwandte Themen