C++ 无法从枚举转换为 LPCTSTR [关闭]

Posted

技术标签:

【中文标题】C++ 无法从枚举转换为 LPCTSTR [关闭]【英文标题】:C++ cannot convert from enum to LPCTSTR [closed] 【发布时间】:2014-06-05 11:17:14 【问题描述】:

我在 Visual Studio 中编译游戏源代码,编译时发现一些错误。

错误 C2440:“正在初始化”:无法从 'eKind' 到 'LPCTSTR' 从整数类型转换为指针类型需要 reinterpret_cast、C-style cast 或 function-style cast

enum eKind

        NONE,
        CONSO,  //consonant
        V_UP,   //vowel in upper
        SV_UP,  //special vowel in upper
        V_SIDE, //vowel in side
        V_UN,   //vowel in under
        V_UPSI, //vowel in upper and side
        SOU,    //special in upper
        ENG,    //english and number

LastKind = NONE;

LPCTSTR thai[255] = 
        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,
        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,
        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,
        ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    NONE,   NONE,   NONE,   NONE,   NONE,   NONE,
        NONE,   ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,
        ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    NONE,   NONE,   NONE,   NONE,   NONE,
        NONE,   ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,
        ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    ENG,    NONE,   NONE,   NONE,   NONE,   NONE,
        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,
        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,

        NONE,   CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,
        CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,
        CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,  CONSO,

        V_SIDE, V_UP,   V_SIDE, V_UPSI, V_UP,   V_UP,   V_UP,   V_UP,   V_UN,   V_UN,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,
        V_SIDE, V_SIDE, V_SIDE, V_SIDE, V_SIDE, V_SIDE, V_SIDE, SV_UP,  SOU,    SOU,    SOU,    SOU,    SOU,    NONE,   NONE,   NONE,
        NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE,   NONE
;

有什么问题?如何解决?

【问题讨论】:

错误信息的哪一部分不清楚?它们是不同的数据类型。一个是整数,一个是 C 风格的字符串。你明白为什么int x = "omg"; 是一个错误吗? 枚举是内部整数。所以你不能将它们转换为字符串指针(LPCTSTR) -1 问题中没有示例代码 您可以在 pastebin 链接中看到代码。我不能在这个线程中发帖,因为代码格式会丢失。 @tenfour 谢谢,我明白了。 :) 【参考方案1】:

enum 是一种标量数据类型。 LPCTSTR 是指向 charwchar_t 的指针的 typedef(取决于 Unicode 设置)。

C++ 不允许从标量到指针的隐式转换。使用适当的源数据类型将其分配给LPCTSTR

在您的示例中,您想要定义一个 TCHAR 数组,而不是指向它的指针。

TCHAR thai[255] = 
    NONE,   NONE,  
    // ...
;

【讨论】:

感谢您的帮助。我将更改数据类型。 :)【参考方案2】:

例如,与 C# 不同,您可以在 C/C++ 中获取枚举的字符串表示形式。如果你想要这样的事情,你需要自己写一些。例如:

std::string eKindToString(eKind value)

  switch(value)
  
    case foo: return "foo";
    case bar: return "bar";
    // etc
  

  return "unknown";

【讨论】:

看不到需要进行枚举->字符串转换。我错过了什么吗? 我觉得是因为以后可以使用std::string::c_str()或者std::wstring::c_str() 是的,您的代码展示了如何规避 C++ 缺少的反射功能。但我没有在问题中找到这个。

以上是关于C++ 无法从枚举转换为 LPCTSTR [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 编译时提示:不能将参数 1 从“char [6]”转换为“LPCTSTR”

如何在 C++(MFC) 中将 char* 转换为 LPCTSTR

无法从“const char *”转换为“LPCTSTR”

error C2664: “int CWnd::MessageBoxW(LPCTSTR,LPCTSTR,UINT)”: 无法将参数 1 从“const char [9]”转换为“LPCTSTR”

C++ string 转化为LPCTSTR

从字符串转换为 LPCTSTR 时遇到问题