c++ - 将 MFC CMap 用于 CString int 对

标签 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

最佳答案

问题

我认为你颠倒了键类型和值类型。

您的原始声明将 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/

相关文章:

c++ - 如何将具有相同类型的不同 vector 数据成员的类对象传递给可以对任何这些数据成员进行操作的函数

visual-studio - 获取默认浏览器

mfc - 如何用 scintilla 更改编辑器的背景颜色?

c++ - 从应用程序特定文件夹加载自定义字体文件

c++ - 动态更改文本 qlabel

c++ - 在 Visual Studio 2017 中找不到 nuget 包管理器?

visual-studio - VS2010 "Add Item"目录改变

c++ - DDX_Control 和 DDX_Check 正在崩溃

C++和Swift : How are structs handled in C++ stack frames? struct继承的复杂性为什么Swift不支持struct继承?

android - 如何移动随 Visual Studio 2017 安装的 Android SDK 文件夹?