2010-09-28 25 views
7

Estoy declarando un mapa de cadena a un par de pares de la siguiente manera:Cómo insertar un par de std :: pair dentro de otro std :: pair?

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

Y inicializarlo como:

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

Sin embargo, Visual C++ me da el error "C2664, n constructor podría tomar el tipo de fuente, o la resolución de sobrecarga del constructor era ambigua ".

Soy nuevo en el uso de plantillas y STL y no puedo decir lo que estoy haciendo mal.

+4

Utilice de typedef y 'std :: make_pair' para que sea legible. – GManNickG

+0

Lo formateé para que sea un * bit * más fácil para los ojos. – egrunin

+0

En lugar de anidar todos estos 'std :: pair' s, ¿no podría cambiar a usar' std :: tr1 :: tuple'? Boost tiene una implementación de tupla también. – Praetorian

Respuesta

16

El >>> no se puede analizar correctamente (a menos que tenga un compilador C++ 0x).

Cambio a > > >

Este:

reference.insert("First", 

debe ser:

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

También hay una función de utilidad para hacer la construcción de pares más fácil: las

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

puede ser:

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

Prueba esto:

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

Gracias por la ayuda.Edité mi pregunta para agregar L "" a mi wstring para hacer la pregunta más fácil de "analizar". –

+1

Una respuesta mejor que la mía, pero tenga en cuenta que insertar con 'referencia [clave] = valor' puede dar un comportamiento diferente a' referencia.insertar (make_pair (clave, valor)) '; usar '[]' sobrescribirá un elemento existente, mientras que 'insert' no lo hará. –

2

C++ se confunde por la consecutiva ">" cuando se cierra la plantilla, ya que interpreta que como el operador de desplazamiento.

añadir espacios entre el cierre de las plantillas, el cambio a >>>>>>

+0

Además, el consejo de GMan. – iniju

2

map::insert en sí toma un solo argumento std::pair, en lugar de dos argumentos. Puede poner en orden el código mediante el uso de std::make_pair (que infiere los argumentos de plantilla de los argumentos de la función), para obtener algo como:

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

Ayuda a utilizar typedefs al depurar este tipo de cosas.

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

No existe la función 'insert()' como OP intenta usar, incluso si '#include '. El código de ejemplo que has publicado una obra y es muy fácil de leer, sino porque se ha sustituido el 'inserción()', no debido a la incluyen como parecen decir ... – sth

+0

Si se quita la parte de "sólo tiene' '", que creo que es un poco engañoso, creo que * es * útil y lo votó positivamente. – sth

+0

bien, lo tienes. No sé si se da cuenta de que escribió "operador [] para resultados de inserción en código más fácil de leer" en su respuesta. Como dices, ¡insertar no existe! – ttt

0

Se podría simplificar el código mediante la creación de una función de ayuda para crear pares de pares, análogo a la función std::make_pair de ayuda que está disponible en la biblioteca estándar. También el uso de los mapas para operator[] resultados de inserción en el código más fácil de leer:

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