2010-11-03 8 views
12

estoy trabajando en uno de los proyectos que requierecómo almacenar punteros en el mapa

class MyObj; 

map<string, MyObj*> myMap; 

Aquí la lógica está aquí para asignar el nombre del archivo a la clase MyObj.

Si intenta insertar siguiente

string strFilename = "MyFile"; 
MyObj* pObj = new MyObj(); 

myMap.insert(strFileName, pObj); // This line throwing following error. 

sin concordancia de la función de llamada a 'std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, void*, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, void*> > >::insert(std::string&, void*)'

Puede alguien ayudarme por favor la forma de resolver esto. ¿Existe alguna forma mejor de que podamos hacerlo usando STL

+1

Use los botones de la barra de herramientas sobre el campo de texto para controlar el formato de su pregunta. –

Respuesta

13

he typedef'd estas cosas para que sea más fácil de leer ...

typedef std::map<std::string, MyObj*> MyMap; 
typedef std::pair<std::string, MyObj*> MyPair; 

MyMap myMap; 
string strFilename = "MyFile"; 
MyObj* pObj = new MyObj(); 
myMap.insert(MyPair(strFilename, pObj)); 
7

myMap.insert (strFileName, pObj);

Uso make_pair() dentro insert()

#include <utility> 
//... 
myMap.insert (std::make_pair(strFileName, pObj)) ; 
3

No hay insert miembro que tiene una clave y un valor como argumentos. Sólo tiene que utilizar el operador de índice:

myMap[fileName] = obj; 
+0

No es verdad. 'insert' existe. Ver la respuesta de Prasoon –

+2

Es cierto. La respuesta de Prasoon confirma lo que dije: no hay 'insert 'que tenga una clave y un valor como argumentos. Su respuesta usa la inserción que toma un 'std :: pair ' como su único argumento. –

2
map<string,MyObj*> myMap; 

string strFilename = "MyFile"; 
MyObj* pObj = new MyObj(); 

myMap[strFilename] = pObj; 

debería funcionar bien. Solo recuerde que borrar el mapa no liberará la memoria a la que apuntan los apuntadores.

2

Insertar quiere un par, intente algo como esto:

mymap.insert (pair<string,MyObj*>(strFilename,pObj)); 
0

Usted está llamando insert() incorrectamente. No se necesita una clave y un valor separado, se tarda un par de esta manera:


myMap.insert(pair < string, MyObj* > (strFileName, pObj)); 
+0

Eso no se compilará, el par es una clase de plantilla – robev

+0

Me olvido de que < and > necesita ser escapado. – Dima

10

std :: mapa requiere un par cuando se utiliza la función de inserción.

tiene dos opciones, o bien:

myMap[strFileName] = pObj; 

O:

myMap.insert(std::make_pair(strFileName,pObj)); 
0

Try impulso :: ptr_map()

1

Try impulso :: ptr_map (de impulso :: biblioteca ptr_container) Y con impulso :: asignar biblioteca que incluso no es necesario llamar a la nueva forma manual:

class MyObj { 
    MyObj() { /* some... */ } 
}; 

typedef boost::ptr_map< string, MyObj > MyMap; 
MyMap m; 

using namespace boost::assign; 

ptr_map_insert(m)("first")("second")("third"); 

En este caso se añaden tres elementos en m (con las teclas "primero", "segundo" y "tercer" y con tres objetos creados MyObj()).

O:

class MyObj { 
    MyObj(int _i) : i(_i) { /* some... */ } 
    int i; 
}; 

typedef boost::ptr_map< string, MyObj > MyMap; 
MyMap m; 

using namespace boost::assign; 

ptr_map_insert(m)("first", 1)("second", 2)("third", 3); 

En este caso se añaden tres elementos en m. El primer elemento tiene la clave "primero" y el valor MyObj (1), la segunda clave "segundo" y MyObj (2), la tercera clave "tercero" y MyObj (3).

Cuestiones relacionadas