CAtlMap 使用 CString 作为键
CAtlMap use CString as a key
为了简单起见,我在 Visual Studio 中通过向导创建了新的 MPF 项目。我想使用 CAtlMap
和 CString
作为关键参数。我包括 <atlcoll.h>
header 并且当我尝试编译以下代码时:
CAtlMap<CString, double> myMap;
CString strMyKey = L"MyKey";
myMap.SetAt(strMyKey, 76.8);
我收到此错误:
'<function-style-cast>' : cannot convert from 'const CString' to 'ULONG_PTR'
当我使用简单类型(例如 int
)而不是 CString
时,项目编译没有任何错误。是否可以像上面的例子那样使用CString
?也许我错过了一些包含文件,我应该使用哪个?
请使用 CMap
而不是 CAtlMap
,因为它是 outdated/deprecated(ATL 和 MFC 集合 类 已统一)。你应该这样定义你的地图:
CMap<CString, LPCTSTR, double, double> myMap;
还请考虑使用 operator[]
而不是 SetAt()
以获得更好的代码可读性。
如果出于某种原因(与某些 old/legacy 项目的兼容性)您必须使用 CAtlMap
您必须这样做:CAtlMap<CString, double, CStringElementTraits<CString> > map;
Visual Studio 2012 CAtlMap
class 适合提到的用途,不会给出编译错误。您可以为 ATL 支持创建一个控制台应用程序复选框,此代码编译并运行良好。
#include "stdafx.h"
#include <atlcoll.h>
int _tmain(int argc, _TCHAR* argv[])
{
CAtlMap<CString, double> myMap;
CString strMyKey = L"MyKey";
myMap.SetAt(strMyKey, 76.8);
return 0;
}
正如您提到的,您正在处理遗留项目,它可能碰巧有旧版本 ATL 的副本,例如 ATL 3.0。事实上,较旧的 ATL 可能有这样的问题,如果这是问题,您可能需要将代码切换到较新的 ATL 集合 classes.
为了简单起见,我在 Visual Studio 中通过向导创建了新的 MPF 项目。我想使用 CAtlMap
和 CString
作为关键参数。我包括 <atlcoll.h>
header 并且当我尝试编译以下代码时:
CAtlMap<CString, double> myMap;
CString strMyKey = L"MyKey";
myMap.SetAt(strMyKey, 76.8);
我收到此错误:
'<function-style-cast>' : cannot convert from 'const CString' to 'ULONG_PTR'
当我使用简单类型(例如 int
)而不是 CString
时,项目编译没有任何错误。是否可以像上面的例子那样使用CString
?也许我错过了一些包含文件,我应该使用哪个?
请使用 CMap
而不是 CAtlMap
,因为它是 outdated/deprecated(ATL 和 MFC 集合 类 已统一)。你应该这样定义你的地图:
CMap<CString, LPCTSTR, double, double> myMap;
还请考虑使用 operator[]
而不是 SetAt()
以获得更好的代码可读性。
如果出于某种原因(与某些 old/legacy 项目的兼容性)您必须使用 CAtlMap
您必须这样做:CAtlMap<CString, double, CStringElementTraits<CString> > map;
Visual Studio 2012 CAtlMap
class 适合提到的用途,不会给出编译错误。您可以为 ATL 支持创建一个控制台应用程序复选框,此代码编译并运行良好。
#include "stdafx.h"
#include <atlcoll.h>
int _tmain(int argc, _TCHAR* argv[])
{
CAtlMap<CString, double> myMap;
CString strMyKey = L"MyKey";
myMap.SetAt(strMyKey, 76.8);
return 0;
}
正如您提到的,您正在处理遗留项目,它可能碰巧有旧版本 ATL 的副本,例如 ATL 3.0。事实上,较旧的 ATL 可能有这样的问题,如果这是问题,您可能需要将代码切换到较新的 ATL 集合 classes.