使用MFC CMap for CString int pair

时间:2015-08-14 21:57:48

标签: c++ visual-studio mfc

我目前正在研究一个需要在值的友好名称和值本身之间来回转换的DLL。由于此代码在整个代码库中的许多地方使用,我想尝试将其保持简单并在单个函数或对象中,因此我只需要声明它们一次。

从我的阅读中可以看出CMap是工作的工具,但我似乎无法发现任何编译参数的组合而没有错误。

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

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

2 个答案:

答案 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   似乎总是正确的,除非:

     
      
  • 您正在使用原始日期类型,例如intchar,其中按值传递没有区别(可能更快)   通过按引用。
  •   
  • 如果您使用CString作为KEY,则应将LPCTSTR用作ARG_KEY而不是CString &,我们稍后会详细讨论。
  •   

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