用于C ++中priority_queue的奇怪的用户定义比较结构错误

时间:2017-01-09 07:22:51

标签: c++ templates comparison

以下代码编译失败,这很奇怪:

#include <iostream>
#include <queue>
using namespace std;

struct Node {
    char  data;
    Node* next;
    Node(char c, struct Node* nptr = nullptr)
        : data(c), next(nptr) {}
};

struct NodeCmp {
    bool operator()(const Node*& lhs, const Node*& rhs) const {
        return lhs->data > rhs->data;
    }
};

int main() {
    priority_queue<Node*, vector<Node*>, NodeCmp> PQ;

    return 0;
}

有错误:

prog.cpp:13:10: note:   conversion of argument 2 would be ill-formed:
In file included from /usr/include/c++/5/bits/stl_algobase.h:71:0,
                 from /usr/include/c++/5/bits/char_traits.h:39,
                 from /usr/include/c++/5/ios:40,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from prog.cpp:1:
/usr/include/c++/5/bits/predefined_ops.h:123:46: error: invalid initialization of non-const reference of type 'const Node*&' from an rvalue of type 'const Node*'
         { return bool(_M_comp(*__it1, *__it2)); }
                                              ^

请参阅此IDE一个链接:http://ideone.com/T2ST03

但是,使用模板的以下内容很好:

#include <iostream>
#include <queue>
using namespace std;

struct Node {
    char  data;
    Node* next;
    Node(char c, struct Node* nptr = nullptr)
        : data(c), next(nptr) {}
};

template <class T>
struct NodeCmp {
    bool operator()(const T& lhs, const T& rhs) const {
        return lhs->data > rhs->data;
    }
};

int main() {
    priority_queue<Node*, vector<Node*>, NodeCmp<Node*>> PQ;

    return 0;
}

请参阅IDE一个链接:http://ideone.com/xPcNFK

我想了解这是怎么发生的,为什么在C ++中这样呢?感谢。

2 个答案:

答案 0 :(得分:2)

这是指向const Node指针的(非常量左值)引用:

const Node*& lhs

非const左值引用无法绑定到标准C ++中的临时值。这是编译器错误的原因。最简单的解决方法是根本不传递引用:

bool operator()(const Node* lhs, const Node* rhs) const

它与模板示例一起使用的原因是,对于T = Node*const T&解析为constNode*的引用。

答案 1 :(得分:2)

const T& T = Node* Node* const&const Node*&,而不是Node * const& p

  • Node是指向非const const Node*& 的指针的 const引用,即您无法修改它,但是你可以修改它指向的内容。

  • Node是指向 const bool operator()(const Node* lhs, const Node* rhs) const 的指针的非const引用,即您可以修改指针,但不是它指的是什么。

如果您知道自己正在处理指针,请不要使用引用:

$n