3

这个错误:

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

发生在此函数的唯一行上:

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

_animations是一个std::map<std::string, AnimationFrameSet>

AnimationFrameSet 声明了一个 operator=(...) 和一个复制构造函数,但奇怪的是,编译器说它在尝试复制const std::string... 时失败,即使字符串甚至没有作为const.

我一生都无法弄清楚(甚至不记得!:P)为什么这是/应该抛出/抛出错误。

谢谢。

编辑

我有点困惑为什么这不起作用的原因是不同的类使用非常相似的实现并且它不会引发错误:

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

类型定义:

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

2 回答 2

0

由于_animations是 a std::map,请尝试使用另一种插入方法,例如:

_animations[name] = animation;

但更重要的是要检查 AnimationFrameSet 类是否具有有效的复制构造函数和赋值运算符。如果不是,您可能需要使用智能指针类,例如:

typedef std::shared_ptr<AnimationFrameSet> AnimationFrameSetPtr;

那么地图将是:

std::map<std::string, AnimationFrameSetPtr>
于 2011-10-15T07:14:33.333 回答
0

这失败的原因是因为您使用的 std::map 容器需要一个 const 值作为键值。

在此处查看 std::map 的文档。

例子:

class TestClass
{
};

std::map< const std::string, TestClass > myMap;
std::pair< const std::string, TestClass > firstElement = std::make_pair("test", TestClass() );
myMap.insert( firstElement );
于 2011-10-15T08:48:49.573 回答