我目前正在处理一个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
发布于 2015-08-14 22:11:55
问题
我想你把钥匙型和瓦利式颠倒了。
原始声明将int
定义为使用operator[]
搜索的键。这样encodermap[0] = "Encoder 1";
就能工作了。
但是当您的编译器看到encodermap["Encoder 1"] = 0;
时,他试图找到一个operator[]
,它接受char* (或者char *可以转换成的东西)并返回一个int。最后一条错误消息告诉您,他无法为您的地图找到这样的操作员。
使用MSVC 2015,错误信息更加简洁:C2679。
解决方案
您应该用一个CMap
键和一个int
值来定义您的int
。要知道的诀窍是,对于CString
密钥,ARG_KEY应该是LPCWSTR
。所以正确的定义是:
CMap<CString, LPCWSTR, int, int> encodermap;
这允许使用CString
作为映射的operator[]
中的键。
现在,如果在windows上使用MFC,则可能使用UNICODE和wide chars (因此使用LPCWSTR而不是LPCSTR)。然后,在调用运算符时,您必须使用CString或宽文本:
encodermap[L"Encoder 1"] = 0;
encodermap[CString("Encoder 2")] = 1;
发布于 2015-08-14 23:05:43
试试这个:
CMap<CString, LPCTSTR, int, int> encodermap;
这篇CodeProject文章CMap如何-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;
,它将适用于单字节、多字节或Unicode和LPCTSTR
类型胡枝子。您还需要#include <tchar.h>
。
https://stackoverflow.com/questions/32019236
复制相似问题