0
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 番目のメソッドが原因でした。

4

1 に答える 1