我目前正在开发一个 DLL,它需要在值的友好名称和值本身之间来回转换。由于此代码在整个代码库的许多地方使用,我想尝试使其简单并在单个函数或对象中使用,因此我只需声明一次。
根据我的阅读,CMap
似乎是完成这项工作的工具,但我似乎无法发现任何可以无错编译的模板参数组合。
我的值是 CString
和 int
。我尝试了以下定义:
CMap<int, int, CString, CString> encodermap;
哪个编译,但是当我尝试添加一个值时:
encodermap["Encoder 1"] = 0;
我收到以下编译器错误:
error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2501: 'encodermap' : missing storage-class or type specifiers
error C2040: 'encodermap' : 'int []' differs in levels of indirection from 'CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>'
我已经尝试将 CMap
更改为:
CMap<CString, CString, int, int> encodermap;
但我得到了同样的四个错误。
我确定我一定遗漏了什么,但我不知道是什么。
由于 SDK 被用于这项工作,我需要 VS2003
最佳答案
问题
我认为你颠倒了键类型和值类型。
您的原始声明将 int
定义为要使用 operator[]
搜索的键。所以 encodermap[0] = "Encoder 1";
会起作用。
但是当你的编译器看到 encodermap["Encoder 1"] = 0;
时,他试图找到一个 operator[]
来接受 char* char * 可以转换为)并返回一个int。最后一条错误消息告诉您他无法为您的 map 找到这样的运算符(operator)。
使用 MSVC 2015,错误消息更简洁:C2679 .
解决方案
你应该定义你的 CMap
使用 CString
键和 int
值。要知道的诀窍是,对于 CString
KEY,ARG_KEY 应该是 LPCWSTR
。所以正确的定义是:
CMap<CString, LPCWSTR, int, int> encodermap;
这允许使用 CString
作为 map operator[]
中的键.
现在,如果您在 Windows 上使用 MFC,您可能会使用 UNICODE 和宽字符(因此使用 LPCWSTR 而不是 LPCSTR)。调用运算符时,您必须使用 CString 或宽文字:
encodermap[L"Encoder 1"] = 0;
encodermap[CString("Encoder 2")] = 1;
关于c++ - 将 MFC CMap 用于 CString int 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32019236/