c++;找不到映射[]运算符 void库::addKeywordsForItem(常量项*常量项,int-nKeywords,…) { //此函数中的代码演示如何在C++中处理VARARG 列表关键词; 字符*关键字; va_开始(关键字、词汇); for(int i=0;iaddKeyword(字符串(关键字)); ItemSet*ItemSet=keywordItems[字符串(关键字)]; if(itemSet==NULL) { itemSet=新的itemSet(); 关键字项[关键字]=项集; } bool isNull=(itemSet==NULL)?true:false; 项目集->插入((项目*)常量(项目)); } va_端(关键词); } 常量项集*库::itemsForKeyword(常量字符串和关键字)常量 { 返回关键字items[((字符串)const_cast(关键字))]; }

c++;找不到映射[]运算符 void库::addKeywordsForItem(常量项*常量项,int-nKeywords,…) { //此函数中的代码演示如何在C++中处理VARARG 列表关键词; 字符*关键字; va_开始(关键字、词汇); for(int i=0;iaddKeyword(字符串(关键字)); ItemSet*ItemSet=keywordItems[字符串(关键字)]; if(itemSet==NULL) { itemSet=新的itemSet(); 关键字项[关键字]=项集; } bool isNull=(itemSet==NULL)?true:false; 项目集->插入((项目*)常量(项目)); } va_端(关键词); } 常量项集*库::itemsForKeyword(常量字符串和关键字)常量 { 返回关键字items[((字符串)const_cast(关键字))]; },c++,map,stl,operator-keyword,C++,Map,Stl,Operator Keyword,在上面的代码中,第一个方法按预期工作。第二个方法没有,并显示错误@“[” 没有运算符“[]”与这些操作数匹配操作数类型为:const StringToItemSetMap[std::string] StringToItemSetMap只是map的一个typedef。我尝试了不同的类型转换,并创建了一个本地字符串变量,但运气不好。即使像keywordItems[string(“test”)];这样的东西在第二种方法中也不起作用,但在第一种方法中起作用。我可能错过了什么吗 编辑: const Ite

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

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

StringToItemSetMap只是map的一个typedef。我尝试了不同的类型转换,并创建了一个本地字符串变量,但运气不好。即使像keywordItems[string(“test”)];这样的东西在第二种方法中也不起作用,但在第一种方法中起作用。我可能错过了什么吗

编辑:

const ItemSet*库::itemsForKeyword(const字符串和关键字)const
{
std::map::const_迭代器it=keywordItems.find(关键字);
if(it!=keywordItems.end())
{
返回->秒;
}
返回NULL;
}

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

您使用的是重写的
运算符[]
,它必须具有对基础映射的非常量访问权限,因为如果请求的键位置不存在新条目,它将添加一个新条目。在您的情况下,这将添加一个空指针(不说明原因)。您的成员函数被声明为
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.end())
    {
        return it->second;
    }
    return NULL;
}
const ItemSet*库::itemsForKeyword(const字符串和关键字)const
{
std::map::const_迭代器it=keywordItems.find(关键字);
if(it!=keywordItems.cend())
返回->秒;
返回空ptr;
}

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

您使用的是覆盖的
操作符[]
,它必须具有对基础映射的非常量访问权限,因为如果请求的键位置不存在新条目,它将添加一个新条目。在您的情况下,这将添加一个空指针(不说明原因)。您的成员函数被声明为
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.end())
    {
        return it->second;
    }
    return NULL;
}
const ItemSet*库::itemsForKeyword(const字符串和关键字)const
{
std::map::const_迭代器it=keywordItems.find(关键字);
if(it!=keywordItems.cend())
返回->秒;
返回空ptr;
}

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

您是否尝试过
关键字项目[“test”]
?我是否应该问你为什么要进行
常量转换
,然后立即对
字符串进行C风格转换
?不要使用
char*
作为映射键。@Dukeling是的,结果我得到了相同的错误。实际上,这是我在没有想法的时候尝试过的。正如我已经提到的,我尝试过放置字符串(“test”)并且得到了相同的错误。Luchian Grigore我一开始实际上是在使用它,但是切换到字符串作为键。这无助于解决错误。提供一个帮助来防止丢失有用的代码(例如,
keywordItems
的定义)并允许我们轻松地玩一下,看看什么是有效的。您尝试过
keywordItems吗[“test”]
?我应该问你为什么要进行
常量转换
,然后立即对
字符串进行C风格转换
。?不要使用
char*
作为映射键。@Dukeling是的,结果我得到了相同的错误。实际上,这是我在没有想法时尝试过的。正如我已经提到的,我试着把字符串(“测试“)并得到相同的错误。Luchian Grigore我一开始实际上是在使用它,但切换到字符串作为键。这无助于解决错误。提供一个用于防止丢失有用代码(例如,
关键字项的定义
)的并且让我们可以轻松地玩一玩,看看什么是有效的。谢谢你的回答。我用工作代码编辑了这篇地区文章。我注意到你有一个const ItemSet*的动态强制转换。我不知道为什么需要它。你能简要解释一下吗?或者使用
.at()<代码> >代码> const <代码>;需要C++ 11支持.j.jM2.Me我不知道你的地图是什么。它是代码>项目集*/CUT>不需要。如果它是基类指针类型,那么你应该正确地将它转换成正确的返回类型。这是C++。避免使用C风格的铸件作为实践。我把它拉到了SimpTi上。在您的地图上,如我的示例中的迭代器decl所示。希望它是正确的。感谢您的回答。我编辑了区域p
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;
}