2011-10-15 3 views
3

Cette erreur:std :: paire de std :: string et la classe personnalisée ne copie sur std :: carte :: insert (std :: make_pair (string, classe))

error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion) c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility 216 

se produit sur cette seule ligne de fonction:

void Animation::AddAnimation(std::string name, AnimationFrameSet& animation) { 
    _animations.insert(std::make_pair(name, animation)); 
} 

_animations est un std::map<std::string, AnimationFrameSet>

AnimationFrameSet déclare un opérateur = (...) et un constructeur de copie, mais assez étrangement, que le compilateur dit qu'il échoue sur la copie tentative de const std::string ... même si la chaîne n'est même pas passée en const.

Je ne peux pas pour la vie de moi comprendre (ou même se souvenir de: P) pourquoi cela est/devrait jeter/jeter une erreur.

Merci.

EDIT

La raison pour laquelle je suis un peu confus pourquoi cela ne fonctionne pas est qu'une classe différente utilise une implémentation très similaire et il ne jette pas une erreur:

BITMAP* BitmapCache::GetBitmap(std::string filename) { 
    //Return NULL if a bad filename was passed. 
    if(filename.empty()) return NULL; 
    if(exists(filename.c_str()) == false) return NULL; 

    //Reduce incorrect results by forcing slash equality. 
    filename = fix_filename_slashes(&filename[0]); 

    //Clean the cache if it's dirty. 
    CleanCache(); 

    //Search for requested BITMAP. 
    MapStrBmpIter _iter = _cache.find(filename); 

    //If found, return it. 
    if(_iter != _cache.end()) return _iter->second; 

    //Otherwise, create it, store it, then return it. 
    BITMAP* result = load_bmp(filename.c_str(), NULL); 
    if(result == NULL) return NULL; 
    /*Similar insert line, a non-const std::string that was passed in is passed to a std::make_pair(...) function*/ 
    _cache.insert(std::make_pair(filename, result)); 
    return result; 
} 

typedefs :

typedef std::map<std::string, BITMAP*> MapStrBmp; 
typedef MapStrBmp::iterator MapStrBmpIter; 
+0

Pouvez-vous nous montrer le '' = opérateur? Que se passe-t-il si vous spécifiez explicitement les arguments de type 'make_pair'? –

+3

Avez-vous déjà inscrit "#include "? – Arunmu

+0

également essayer de fournir un code minimum qui donne le même problème – Arunmu

Répondre

0

La raison pour laquelle c'est un échec parce que le std :: carte Le conteneur que vous utilisez attend une valeur const comme valeur clé.

Vérifiez la documentation de std :: map here.

Exemple:

class TestClass 
{ 
}; 

std::map< const std::string, TestClass > myMap; 
std::pair< const std::string, TestClass > firstElement = std::make_pair("test", TestClass()); 
myMap.insert(firstElement); 
0

Depuis _animations est un std::map, essayez d'utiliser une autre méthode de dans sertion, tels que:

_animations[name] = animation; 

Mais la chose plus important de vérifier serait si la classe AnimationFrameSet a un constructeur de copie valide et d'affectation. Si cela ne vous voudrez peut-être utiliser une classe de pointeur intelligent comme:

typedef std::shared_ptr<AnimationFrameSet> AnimationFrameSetPtr; 

Ensuite, la carte serait:

std::map<std::string, AnimationFrameSetPtr>