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))];
}
위의 코드에서 첫 번째 방법은 예상대로 작동합니다. 두 번째 방법은 없으며, 오류가 표시 @ "["C++ 맵 [] 연산자를 찾을 수 없음
더 연산자 "[]"이 피연산자 피연산자 타입이 일치하지 : CONST StringToItemSetMap는 [STD : 문자열]
StringToItemSetMap 인 지도의 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이었다.
'keywordItems [ "test"]'를 사용해 보셨습니까? – Dukeling
내가 왜'const_cast'를하고,'C 스타일'을'string'으로 캐스팅했는지 물어봐야할까요? – cHao
'char *'를 맵 키로 사용하지 마십시오. –