2010-11-03 7 views
12

Je travaille sur l'un des projets qui nécessitecomment stocker des pointeurs sur la carte

class MyObj; 

map<string, MyObj*> myMap; 

Ici la logique est ici pour la carte le nom du fichier à la classe MyObj.

Si je tente d'insérer suivant

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

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

pas de fonction correspondant pour appel à '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*)'

quelqu'un peut me aider s'il vous plaît comment résoudre ce problème. Y a-t-il une meilleure façon de le faire en utilisant STL

+1

Utilisez les boutons de la barre d'outils au-dessus du champ de texte pour contrôler le formatage de votre question. –

Répondre

13

J'ai typedef ce genre de choses pour le rendre plus lisible ...

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 (strFichier, pObj);

utilisation make_pair() intérieur insert()

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

Il n'y a aucun membre insert qui prend une clé et une valeur comme arguments. Il suffit d'utiliser l'opérateur d'index:

myMap[fileName] = obj; 
+0

Ce n'est pas vrai. 'insert' existe. Voir Prasoon answer –

+2

C'est vrai. La réponse de Prasoon confirme ce que j'ai dit: Il n'y a pas de 'insert' qui prend une clé et une valeur comme arguments. Sa réponse utilise l'insert qui prend un 'std :: pair ' comme seul argument. –

2
map<string,MyObj*> myMap; 

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

myMap[strFilename] = pObj; 

devrait fonctionner très bien. Rappelez-vous simplement que l'effacement de la carte ne libèrera pas la mémoire vers laquelle pointent les pointeurs.

2

Insérer veut une paire, essayez quelque chose comme ceci:

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

Vous appelez insert() de manière incorrecte. Il ne prend pas une clé et une valeur séparément, il faut une paire comme ceci:


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

Cela ne compilera pas, la paire est un modèle de classe – robev

+0

Je continue d'oublier que < and > doivent être échappés. – Dima

10

std :: carte nécessite une paire lorsque vous utilisez la fonction d'insertion.

Vous avez deux options, soit:

myMap[strFileName] = pObj; 

Ou:

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

Essayez boost :: ptr_map()

1

Essayez boost :: ptr_map (de boost :: bibliothèque ptr_container). Et avec boost :: bibliothèque Assign même ne pas besoin d'appeler manuellement nouvelle:

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

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

using namespace boost::assign; 

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

Dans ce cas, trois éléments seront ajoutés en m (avec les touches « premier », « deuxième » et « troisième » et trois objets créés MyObj()).

Ou:

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

Dans ce cas, trois éléments seront ajoutés en m. Le premier élément a la clé "first" et la valeur MyObj (1), la deuxième clé "second" et MyObj (2), la troisième clé "third" et MyObj (3).

Questions connexes