Je travaille sur l'un des projets qui nécessite
class MyObj;
map<string, MyObj*> myMap;
Ici, la logique est ici pour mapper le nom du fichier à la classe MyObj.
Si j'essaye d'insérer ce qui suit
string strFilename = "MyFile";
MyObj* pObj = new MyObj();
myMap.insert(strFileName, pObj); // This line throwing following error.
pas de fonction correspondante pour l'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-il m'aider s'il vous plaît comment résoudre ce problème. Existe-t-il un meilleur moyen de le faire en utilisant STL?
J'ai tapé ce matériel 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));
std :: map 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));
myMap.insert (strFileName, pObj);
Utilisez make_pair()
inside insert()
#include <utility>
//...
myMap.insert (std::make_pair(strFileName, pObj) ) ;
Il n'y a pas de membre insert
qui prend une clé et une valeur en tant qu'arguments. Il suffit d'utiliser l'opérateur d'index:
myMap[fileName] = obj;
map<string,MyObj*> myMap;
string strFilename = "MyFile";
MyObj* pObj = new MyObj();
myMap[strFilename] = pObj;
Devrait fonctionner très bien. N'oubliez pas que l'effacement de la carte ne libérera pas la mémoire indiquée par les pointeurs.
Insert veut une paire, essayez quelque chose comme ça:
mymap.insert ( pair<string,MyObj*>(strFilename,pObj) );
Essayez boost :: ptr_map (à partir de la bibliothèque boost :: ptr_container). Et avec boost :: assign, vous n’avez même pas besoin d’appeler new manuellement:
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 dans m (avec les clés "premier", "deuxième" et "troisième" et avec 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 dans m. Le premier élément a la clé "premier" et la valeur MyObj (1), la deuxième clé "deuxième" et MyObj (2), la troisième clé "troisième" et MyObj (3).
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));
Essayez boost :: ptr_map ()