找不到c ++ Map []运算符

时间:2013-08-19 07:54:01

标签: c++ map stl operator-keyword

void Library::addKeywordsForItem(const Item* const item, int nKeywords, ...)
{
    // the code in this function demonstrates how to handle a vararg in C++

    va_list     keywords;
    char        *keyword;

    va_start(keywords, nKeywords);
    for (int i = 0; i < nKeywords; i++)
    {
        keyword = va_arg(keywords, char*);
        ((Item*)const_cast<Item*>(item))->addKeyword(string(keyword)); 

        ItemSet* itemSet = keywordItems[string(keyword)];
        if (itemSet == NULL)
        {
            itemSet = new ItemSet();
            keywordItems[keyword] = itemSet;
        }
        bool isNull = (itemSet == NULL) ? true : false;
        itemSet->insert(((Item*)const_cast<Item*>(item)));
    }
    va_end(keywords);
}

const ItemSet* Library::itemsForKeyword(const string& keyword) const
{
    return keywordItems[((string)const_cast<string&>(keyword))];
}

在上面的代码中,第一个方法按预期工作。第二种方法没有,并显示错误@“[”

  

没有运算符“[]”匹配这些操作数操作数类型是:const   StringToItemSetMap [std :: string]

StringToItemSetMap只是map的typedef。我尝试过不同的强制转换,以及创建一个本地字符串变量,但不是运气。甚至像keywordItems [string(“test”)];在第二种方法中不起作用,但在第一种方法中起作用。有什么我可能会错过的吗?

编辑:

const ItemSet* Library::itemsForKeyword(const string& keyword) const
{
    std::map<std::string, ItemSet*>::const_iterator it = keywordItems.find(keyword);
    if (it != keywordItems.end())
    {
        return it->second;
    }
    return NULL;
}

正如在答案中指出的那样,问题是因为第二种方法是const而map :: operator []不是。

1 个答案:

答案 0 :(得分:4)

您正在使用被覆盖的operator[],它必须具有对基础地图的非const访问权限,因为如果在请求的密钥位置不存在,则会添加新条目。在你的情况下,将添加一个NULL指针(不考虑原因)。你的成员函数被声明为const,因此地图是不可修改的。

将地图声明为mutable(不推荐),或使用迭代器搜索并在搜索返回keywordItems.end()时返回NULL。否则,返回迭代器的对象(在it->second中)。

示例

const ItemSet* Library::itemsForKeyword(const string& keyword) const
{
    std::map<std::string, ItemSet*>::const_iterator it =  keywordItems.find(keyword);
    if (it != keywordItems.cend())
       return it->second;
    return nullptr;
}

注意:我强烈建议使用直接对象,或者至少使用智能指针(例如std::shared_ptr<ItemSet>)作为地图对象内容。 RAII:吃什么晚餐。