MFC CMap 使用问题

南friend 2014-03-30 11:19:38
//小弟刚开学编程,对于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;
}
...全文
832 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧