具有“const CompareVPtrs”类型的表达式将丢失一些 const-volatile 限定符以便调用

Posted

技术标签:

【中文标题】具有“const CompareVPtrs”类型的表达式将丢失一些 const-volatile 限定符以便调用【英文标题】:expression having type 'const CompareVPtrs' would lose some const-volatile qualifiers in order to call 【发布时间】:2013-11-06 15:32:38 【问题描述】:

我正在用 C++ 实现十五个益智控制台游戏,引发以下错误

Error 4  error C3848: expression having type 'const CompareVPtrs' would lose some
   const-volatile qualifiers in order to call 
   'bool CompareVPtrs::operator ()(Vertex *,Vertex *)'    
   c:\program files\microsoft visual studio 11.0\vc\include\xfunctional   
  324 1  puzzle15

这是我的结构

struct CompareVPtrs: public binary_function<Vertex*, Vertex*, bool>

    bool operator()( Vertex *lhs, Vertex *rhs)
    
        return equal((int *)lhs->state, (int *)lhs->state+16,
            (int *)rhs->state);
    

CompareVP;

完整游戏源码https://gist.github.com/sunloverz/7338003

【问题讨论】:

【参考方案1】:

这意味着你的比较运算符需要是const

bool operator()( Vertex *lhs, Vertex *rhs) const
 //                                       ^^^^^
  ....

【讨论】:

这是一个更有趣的问题,为什么此错误消息仅出现在发布(生产)版本中,而不出现在调试版本中。 (刚才遇到了同样的问题。) 仅在发布版本中遇到相同的错误消息。放置 const 关键字解决了它,谢谢!有趣的是,错误消息出现在 VS2015 社区中,但没有出现在 VS2010 中(2015 年使用不同的工具集 v140_xp 与 2010 年使用 v100,这可能就是原因)。【参考方案2】:

出现这个问题的原因之一是:

由于编译器一致性改进或标准更改而不再干净编译的代码。

您可以在此处阅读更多信息:

Upgrade C++ projects from earlier versions of Visual Studio Overview of potential upgrade issues (Visual C++)

【讨论】:

以上是关于具有“const CompareVPtrs”类型的表达式将丢失一些 const-volatile 限定符以便调用的主要内容,如果未能解决你的问题,请参考以下文章

GCC:数组类型具有不完整的元素类型

具有联合类型的条件类型

TypeScript JSDoc 风格的类型是不是具有常规类型的全部功能?

元素隐式具有“任何”类型,因为类型的表达式

使用类型中的“in”键入具有计算属性的类型

根据数据类型,具有不同类型单元格的 Jtable