【问题标题】:Cannot convert from 'const wchar_t *' to '_TCHAR *'无法从 'const wchar_t *' 转换为 '_TCHAR *'
【发布时间】:2010-11-03 05:43:36
【问题描述】:
_TCHAR* strGroupName = NULL;
const _TCHAR* strTempName = NULL;

//Assign some value to strTempName

strGroupName = _tcschr(strTempName, 92) //C2440

在 VS2008 中编译此代码时,我在上面的行中遇到错误。在 VC6 中编译正常。

错误 C2440:“=”:无法从 'const wchar_t *' 到 '_TCHAR *'

似乎是什么问题,我该如何解决?

【问题讨论】:

    标签: c++ visual-studio-2008 porting visual-c++-6


    【解决方案1】:

    尝试将其转换为

    strGroupName = (_TCHAR*)_tcschr(strTempName, 92);
    

    在我看来,VS2008 对类型转换更加严格,并且在某些情况下不会自动执行它们。

    【讨论】:

      【解决方案2】:
      strGroupName = const_cast<_TCHAR*>( _tcschr(strTempName, 92));
      

      这是因为您正在使用的函数的变体有一个 const _TCHAR* 作为输入并返回一个 const _TCHAR*。

      另一个变体是将 strTempName 声明为 _TCHAR*,而不是 const _TCHAR*。在这种情况下,使用具有 _TCHAR* 参数并返回 _TCHAR* 值的变体函数。

      【讨论】:

      • 杰克的回答好吗?它摆脱了编译错误,但我想知道他和你的区别。
      • 这个版本更好:它允许您具体说明强制转换的用途,即它不是从一些不相关的类型强制转换,它只是删除了 const。
      • @Bobby 使用 const_cast 操作将允许您通过执行简单的搜索轻松找到代码中的 const 转换。除非真的有必要,否则我不推荐 const 强制转换。第二种选择(将 strTempName 设为非常量)是我的首选,因为它意味着不再更改 constness。顺便说一句,你有什么理由将 strTempName 声明为 const 吗?
      【解决方案3】:

      strGroupName 也应该是指向const 的指针。

      const _TCHAR* strGroupName = _tcschr(strTempName, 92);
      

      在调用初始化它之前无需声明它。

      【讨论】:

        【解决方案4】:

        _tcschr 正在返回一个 const 指针。因此返回值应该是const _TCHAR* strGroupName = NULL; 如果无法将 strGroupName 更改为 const 指针,则将两个指针都声明为非常量指针。

        【讨论】:

        • 这很好,但我不能将 strGroupName 更改为 const,因为它会影响不需要 const 变量的其余代码。例如函数。
        • 然后将 strTempName 和 strGroupName 都设为 non-const。
        • +1 包括两者都可以是非常量的评论(也许将其添加到答案中?)
        猜你喜欢
        • 2017-03-31
        • 2013-08-11
        • 2013-04-19
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多