C++:wchar_t 不能作为键或值存储在 std::map 中

标签 c++ char stdmap wchar-t

我正在尝试创建一个数据类型为 std::map<char, wchar_t> 的变量在 C++ 中。当我尝试这样做时,Visual Studio 给出了这个构建错误:

C2440 'initializing': cannot convert from 'initializer list' to 'std::map<char,wchar_t,std::less<char>,std::allocator<std::pair<const char,wchar_t>>>'

wchar_t时也会出现同样的错误是关键数据类型,char是值数据类型。

您可以通过运行以下代码来重现此错误:

const std::map<char, wchar_t> UNICODE_MAP = {
    { 'X', L"█" },
    { 'G', L"▓" },
    { 'O', L"ᗣ" },
    { 'P', L"ᗤ" }
};

我如何使用键作为 char 制作 map ?值为 wchar_t数据类型?

最佳答案

这是一个从窄字符到宽字符的映射,而不是从字符到宽字符串的映射:

取而代之的是:

const std::map<char, wchar_t> UNICODE_MAP = {
    { 'X', L"█" },
    { 'G', L"▓" },
    { 'O', L"ᗣ" },
    { 'P', L"ᗤ" }
};

使用这个:

const std::map<char, wchar_t> UNICODE_MAP = {
    { 'X', L'█' },
    { 'G', L'▓' },
    { 'O', L'ᗣ' },
    { 'P', L'ᗤ' }
};

如果您确实需要该值是一个字符串,则将其声明为:

const std::map<char, std::wstring> UNICODE_MAP = {
    { 'X', L"█" },
    ...

此外,当我在这里时,我提倡转义源文件中不在 ASCII 范围内的所有 Unicode 字符。在具有不同行为的 IDE、版本控制系统以及大厅里没有阅读您关于“另存为 Unicode”的备忘录的人之间,这很容易被破坏。所以...我的最终建议是:

const std::map<char, wchar_t> UNICODE_MAP = {
    { 'X', L'\u2588' },
    { 'G', L'\u2593' },
    { 'O', L'\u15e3' },
    { 'P', L'\u15e4' }
};

关于C++:wchar_t 不能作为键或值存储在 std::map 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73257227/

相关文章:

c++ - 无法使用 GLEW 在 openGL 中绘制任何内容(mac、c++)

c++ - 除了模板之外,还有其他 C++ 元编程替代方案吗?

c++ - 委派构造函数 : an initializer for a delegating constructor must appear alone

c# - c++ std::map::find 到 c# dictionary<key,value>

c++ - 将 qsort 与 std::sort 进行比较

c++ - While 循环条件 C++

c - 为什么打印 unsigned char 有时有效有时无效?在 C 中

java - java中的字符串到字符数组

java - 在java中如果 "char c = ' a' "why does "c = c + 1“无法编译?

c++ - STL map Custom Key Class [默认构造函数]