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))];
}
上記のコードでは、最初のメソッドは期待どおりに機能します。2 番目の方法はそうではなく、@ "[" というエラーが表示されます。
これらのオペランドに一致する演算子 "[]" はありません オペランドの型は次のとおりです: const StringToItemSetMap [ std::string ]
StringToItemSetMap は単なるマップの typedef です。さまざまなキャストを試し、ローカル文字列変数を作成しましたが、うまくいきませんでした。keywordItems[string("test")]; のようなものでも。2番目の方法では機能しませんが、最初の方法では機能します。私が見逃したかもしれない何かがありますか?
編集:
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;
}
回答の中で指摘されたように、問題は map::operator[] ではなく const である 2 番目のメソッドが原因でした。