MFC CMap 使用问题
//小弟刚开学编程,对于CMap内部机制不是很了解
//下面有使用CMap的关键代码,和错误
//希望各位大大帮帮忙 ,可能的问题是什么?应该怎么改?
enum textCharacter
{
上涨,
下跌,
补涨,
上升,
成交量
};
CMap<CString,CString,textCharacter,textCharacter> myMap;
myMap.InitHashTable(7);
CString str;
char* p ="上涨";
str =p;
myMap.SetAt(str,上涨);
p ="下跌";
str =p;
myMap.SetAt(str,下跌);
p ="补涨";
str =p;
myMap.SetAt(str,补涨);
p ="上升";
str =p;
myMap.SetAt(str,上升);
p ="成交量";
str =p;
myMap.SetAt(str,成交量);
if(myMap.IsEmpty())
AfxMessageBox(_T("init StringToEnumMap fails"));
CString str;
str=fun(); //fun() 是获取str 的函数
textCharacter text;
if(myMap.Lookup(str,text))
{
//一部分代码,建立向量空间模型
switch(text)
{
case 0:
vectorSpace[0] = pVecResult[i].weight;
break;
case 1:
vectorSpace[1] = pVecResult[i].weight;
break;
case 2:
vectorSpace[2] = pVecResult[i].weight;
break;
case 3:
vectorSpace[3] = pVecResult[i].weight;
break;
case 4:
vectorSpace[4] = pVecResult[i].weight;
break;
case 5:
vectorSpace[5] = pVecResult[i].weight;
break;
default:
break;
}
}
编译时的错误信息是:
program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxtempl.h(163): error C2440: “类型转换”: 无法从“ATL::CStringT<BaseType,StringTraits>”转换为“long”
1> with
1> [
1> BaseType=wchar_t,
1> StringTraits=StrTraitMFC_DLL<wchar_t>
1> ]
1> 没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
1> d:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxtempl.h(1531): 参见对正在编译的函数 模板 实例化“UINT HashKey<ARG_KEY>(ARG_KEY)”的引用
1> with
1> [
1> ARG_KEY=CString
1> ]
1> d:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxtempl.h(1530): 编译类 模板 成员函数“CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CAssoc *CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::GetAssocAt(ARG_KEY,UINT &,UINT &) const”时
1> with
1> [
1> KEY=CString,
1> ARG_KEY=CString,
1> VALUE=CSplit::textCharacter,
1> ARG_VALUE=CSplit::textCharacter
1> ]
1> d:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxtempl.h(1553): 参见对正在编译的函数 模板 实例化“CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CAssoc *CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::GetAssocAt(ARG_KEY,UINT &,UINT &) const”的引用
1> with
1> [
1> KEY=CString,
1> ARG_KEY=CString,
1> VALUE=CSplit::textCharacter,
1> ARG_VALUE=CSplit::textCharacter
1> ]
1> d:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxtempl.h(1401): 编译类 模板 成员函数“CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CMap(INT_PTR)”时
1> with
1> [
1> KEY=CString,
1> ARG_KEY=CString,
1> VALUE=CSplit::textCharacter,
1> ARG_VALUE=CSplit::textCharacter
1> ]
1> c:\users\lenovo\documents\visual studio 2012\projects\graduatedesign\graduatedesign\split.cpp(7): 参见对正在编译的函数 模板 实例化“CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CMap(INT_PTR)”的引用
1> with
1> [
1> KEY=CString,
1> ARG_KEY=CString,
1> VALUE=CSplit::textCharacter,
1> ARG_VALUE=CSplit::textCharacter
1> ]
1> c:\users\lenovo\documents\visual studio 2012\projects\graduatedesign\graduatedesign\split.h(34): 参见对正在编译的类 模板 实例化“CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>”的引用
1> with
1> [
1> KEY=CString,
1> ARG_KEY=CString,
1> VALUE=CSplit::textCharacter,
1> ARG_VALUE=CSplit::textCharacter
1> ]
afxtempl.h(163) :
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
// (algorithm copied from STL hash in xfunctional)
ldiv_t HashVal = ldiv((long)(ARG_KEY)key, 127773);
HashVal.rem = 16807 * HashVal.rem - 2836 * HashVal.quot;
if (HashVal.rem < 0)
HashVal.rem += 2147483647;
return ((UINT)HashVal.rem);
}
afxtempl.h(1531):
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
typename CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::CAssoc*
CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::GetAssocAt(ARG_KEY key, UINT& nHashBucket, UINT& nHashValue) const
// find association (or return NULL)
{
nHashValue = HashKey<ARG_KEY>(key);
nHashBucket = nHashValue % m_nHashTableSize;
if (m_pHashTable == NULL)
return NULL;
// see if it exists
CAssoc* pAssoc;
for (pAssoc = m_pHashTable[nHashBucket]; pAssoc != NULL; pAssoc = pAssoc->pNext)
{
if (pAssoc->nHashValue == nHashValue && CompareElements(&pAssoc->key, &key))
return pAssoc;
}
return NULL;
}
afxtempl.h(1553):
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
BOOL CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::Lookup(ARG_KEY key, VALUE& rValue) const
{
ASSERT_VALID(this);
UINT nHashBucket, nHashValue;
CAssoc* pAssoc = GetAssocAt(key, nHashBucket, nHashValue);
if (pAssoc == NULL)
return FALSE; // not in map
rValue = pAssoc->value;
return TRUE;
}
afxtempl.h(1401):
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>::CMap(INT_PTR nBlockSize)
{
ASSERT(nBlockSize > 0);
m_pHashTable = NULL;
m_nHashTableSize = 17; // default size
m_nCount = 0;
m_pFreeList = NULL;
m_pBlocks = NULL;
m_nBlockSize = nBlockSize;
}