我目前正在研究一个需要在值的友好名称和值本身之间来回转换的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
答案 0 :(得分:3)
问题
我认为你已经颠倒了密钥类型和valye类型。
您的原始声明将int
定义为使用operator[]
搜索的密钥。所以encodermap[0] = "Encoder 1";
会起作用。
但是当你的编译器看到encodermap["Encoder 1"] = 0;
时,他试图找到一个operator[]
,它接受char *(或char *可以转换成的东西)并返回一个int。最后一条错误消息告诉您他无法为您的地图找到这样的运算符。
使用MSVC 2015,错误消息更简洁:C2679。
解决方案
您应该使用CString
密钥和int
值定义CMap
。要知道的诀窍是,对于CString
KEY,ARG_KEY应该是LPCWSTR
。所以正确的定义是:
CMap<CString, LPCWSTR, int, int> encodermap;
这允许在地图operator[]
中使用CString
作为关键字。
现在,如果在Windows上使用MFC,则可能使用UNICODE和宽字符(因此使用LPCWSTR而不是LPCSTR)。在调用操作符时,您可以使用CString或宽文字:
encodermap[L"Encoder 1"] = 0;
encodermap[CString("Encoder 2")] = 1;
答案 1 :(得分:1)
试试这个:
CMap<CString, LPCTSTR, int, int> encodermap;
此CodeProject文章CMap How-to可能会有所帮助。
很多人对CMap的声明
CMap < KEY, ARG_KEY, VALUE, ARG_VALUE >
感到困惑,为什么不只是CMap < KEY, VALUE >
?事实上,
CMap
中的最终数据容器是CPair
,而{。}}CPair
的内部是{KEY, VALUE}
。因此,CMap
将真正存储一个KEY
,而非ARG_KEY
。但是,如果您使用MFC源代码进行检查, 几乎所有在CMap
内传递的内部参数都是 因此,使用ARG_KEY
作为ARG_VALUE
调用KEY &
和ARG_KEY
似乎总是正确的,除非:
- 您正在使用原始日期类型,例如
int
,char
,其中按值传递没有区别(可能更快) 通过按引用。- 如果您使用
CString
作为KEY
,则应将LPCTSTR
用作ARG_KEY
而不是CString &
,我们稍后会详细讨论。
编辑:Cristophe,另一个分配选项是encodermap[_T("Encoder 1")] = 0;
,它适用于LPCTSTR
typedef的单字节,多字节或Unicode。您还需要#include <tchar.h>
。