【发布时间】:2013-08-19 07:54:00
【问题描述】:
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))];
}
在上面的代码中,第一种方法按预期工作。第二种方法没有,并显示错误@“[”
no operator "[]" 匹配这些操作数操作数类型是: 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[] 不是。
【问题讨论】:
-
你试过
keywordItems["test"]吗? -
我应该问你为什么要做
const_cast,然后立即将C风格转换为string...? -
不要使用
char*作为映射键。 -
@Dukeling 是的,结果我得到了同样的错误。 cHao 其实这是我在没有想法的时候尝试过的。正如我已经提到的,我尝试输入 string("test") 并得到相同的错误。 Luchian Grigore 我一开始实际上是在使用它,但改用字符串作为键。没有帮助解决错误。
-
提供SSCCE 总是有帮助的,以防止丢失有用的代码(例如
keywordItems的定义),并让我们可以轻松地尝试看看哪些有效。
标签: c++ map stl operator-keyword