【问题标题】:C++ cannot convert from enum to LPCTSTR [closed]C++ 无法从枚举转换为 LPCTSTR [关闭]
【发布时间】: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 谢谢,我明白了。 :)

标签: c++ visual-studio


【解决方案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++ 缺少的反射功能。但我没有在问题中找到这个。
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 2021-05-07
  • 2020-08-21
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多