一个小学生程序猿 2024-04-25 22:06 采纳率: 50%
浏览 3

C++结构体神奇报错

struct node
{
    int p, check;
    node(int _p = 0, int _check = 0): p(_p), check(_check) {}
    bool operator <(const node& a)
    {
        if (check != a.check)
            return check > a.check;
        return p > a.p;
    }
};
priority_queue<node> q;

报错信息:required from 'bool __gnu_cxx::__ops::_Iter_comp_val<_Compare>::operator()(_Iterator, _Value&) [with _Iterator = __gnu_cxx::__normal_iterator<node*, std::vector<node, std::allocator<node> > >; _Value = node; _Compare = std::less<node>]'
还有
[Error] passing 'const node' as 'this' argument of 'bool node::operator<(const node&)' discards qualifiers [-fpermissive]

我服了C++编译器,已经定义了bool operator <她还说没有定义。

自己想了半天没有想出来,急!:(

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-04-25 22:06
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    问题概括

    这个问题是关于C++中结构体定义和优先队列(priority_queue)的使用。用户在定义一个结构体node,并为其重载了小于操作符(<),然后使用这个结构体作为priority_queue的元素类型。编译器报错指出,尽管已经定义了<操作符,但在使用priority_queue时仍然出现了问题。

    问题出现原因

    问题出现的原因是C++标准库中的priority_queue要求元素类型必须定义严格弱于(strictly weaker than)关系。在C++中,priority_queue默认情况下是一个最大堆,因此它需要一个严格弱于关系来确定元素的顺序。错误信息表明编译器期望一个const版本的<操作符,但是提供的是非const的。

    问题解决方案

    为了解决这个问题,我们需要确保<操作符是const的,这样priority_queue就可以使用它来进行元素的比较。

    提供代码

    以下是修改后的代码:

    #include <queue>
    #include <vector>
    #include <functional>
    
    struct node
    {
        int p, check;
        node(int _p = 0, int _check = 0): p(_p), check(_check) {}
        
        // 确保 operator< 是 const 的
        bool operator <(const node& a) const
        {
            if (check != a.check)
                return check > a.check;
            return p > a.p;
        }
    };
    
    int main() {
        priority_queue<node> q;
        // 可以继续添加元素到优先队列
        return 0;
    }
    

    代码运行方式

    这段代码可以在任何支持C++11或以上版本的编译器上编译和运行。使用如下命令编译:

    g++ -std=c++11 -o priority_queue_example priority_queue_example.cpp
    

    然后运行编译后的程序:

    ./priority_queue_example
    

    代码预期运行结果

    由于代码中没有具体的输出语句,所以运行这段程序不会有任何输出。但是,它应该可以成功编译,不会报错。

    推荐相关链接

    请注意,链接是英文的,因为大多数编程相关的文档和资源都是英文的,但这些链接提供了最准确和权威的信息。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月25日

悬赏问题

  • ¥50 关于在matlab上对曲柄摇杆机构上一点的运动学仿真
  • ¥15 jetson nano
  • ¥15 :app:debugCompileClasspath'.
  • ¥15 windows c++内嵌qt出现数据转换问题。
  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送