CAtlMap 使用 CString 作为键

CAtlMap use CString as a key

为了简单起见,我在 Visual Studio 中通过向导创建了新的 MPF 项目。我想使用 CAtlMapCString 作为关键参数。我包括 <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.