繁体   English   中英

std ::对std :: string和自定义类无法复制到std :: map :: insert(std :: make_pair(string,class))

[英]std::pair of std::string and custom class fails to copy on std::map::insert(std::make_pair(string, class))

这个错误:

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

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

_animations[name] = animation;

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

typedef std::shared_ptr<AnimationFrameSet> AnimationFrameSetPtr;

然后地图将是:

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

这是失败的原因是因为您使用的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 );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM