首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用MFC CMap实现CString int对

使用MFC CMap实现CString int对
EN

Stack Overflow用户
提问于 2015-08-14 21:57:48
回答 2查看 8K关注 0票数 2

我目前正在处理一个DLL,它需要在一个值的友好名称和值本身之间来回转换。由于这段代码在整个代码库中的许多地方都使用过,所以我想让它保持简单,并且只在一个函数或对象中使用,所以我只需要声明它们一次。

从我的阅读来看,CMap似乎是这项工作的工具,但我似乎没有发现任何组合的模板参数可以编译而没有错误。

我的值是CStringint。我尝试了以下定义:

代码语言:javascript
运行
复制
CMap<int, int, CString, CString> encodermap;

它编译,但是当我试图添加一个值时:

代码语言:javascript
运行
复制
encodermap["Encoder 1"] = 0;

我得到以下编译器错误:

代码语言:javascript
运行
复制
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更改为:

代码语言:javascript
运行
复制
CMap<CString, CString, int, int> encodermap;

但我也犯了同样的四个错误。

我肯定我错过了什么,但我不知道是什么。

因为SDK被用于这项工作,所以我需要VS2003

EN

回答 2

Stack Overflow用户

发布于 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。所以正确的定义是:

代码语言:javascript
运行
复制
CMap<CString, LPCWSTR, int, int> encodermap;

这允许使用CString作为映射的operator[]中的键。

现在,如果在windows上使用MFC,则可能使用UNICODE和wide chars (因此使用LPCWSTR而不是LPCSTR)。然后,在调用运算符时,您必须使用CString或宽文本:

代码语言:javascript
运行
复制
        encodermap[L"Encoder 1"] = 0;
        encodermap[CString("Encoder 2")] = 1;
票数 5
EN

Stack Overflow用户

发布于 2015-08-14 23:05:43

试试这个:

代码语言:javascript
运行
复制
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_KEYARG_VALUE调用的,因此,使用KEY &作为ARG_KEY似乎总是正确的,除非:

  • 您使用的是原始日期类型,如intchar,在这些类型中,按值传递与按引用传递没有任何区别(甚至更快)。
  • 如果您使用CString作为KEY,则应该使用LPCTSTR作为ARG_KEY而不是CString &,稍后我们将更详细地讨论这一点。

编辑: Cristophe,该分配的另一个选项是encodermap[_T("Encoder 1")] = 0;,它将适用于单字节、多字节或Unicode和LPCTSTR类型胡枝子。您还需要#include <tchar.h>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32019236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档