Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优先级队列没有名为top()的成员?_C++_Templates_Stl_Priority Queue_Comparator - Fatal编程技术网

C++ 优先级队列没有名为top()的成员?

C++ 优先级队列没有名为top()的成员?,c++,templates,stl,priority-queue,comparator,C++,Templates,Stl,Priority Queue,Comparator,这是我的比较器类: template <class T> class EdgeComparator{ public: bool operator()(std::pair<Edge<T>, int>& lhs, std::pair<Edge<T>, int>& rhs) const{ return lhs.second <= rhs.second; }

这是我的比较器类:

template <class T>
class EdgeComparator{
    public:
        bool operator()(std::pair<Edge<T>, int>& lhs, std::pair<Edge<T>, int>& rhs) const{
            return lhs.second <= rhs.second;
        }
};
模板
类边缘比较器{
公众:
布尔运算符()(std::pair&lhs,std::pair&rhs)常量{
返回lhs.second PQUE;
这里是错误发生的地方——在一系列关于预编译器的奇怪错误消息之后:

std::pair<Edge<T>, int> topEdge = pQueue.top();
./Prim.cpp:60:54: error: ‘class std::priority_queue<std::pair<Edge<int>, int>, std::vector<std::pair<Edge<int>, int>, EdgeComparator<int> >, std::less<std::pair<Edge<int>, int> > >’ has no member named ‘top’
         std::pair<Edge<T>, int> topEdge = pQueue.top();
std::pair-topEdge=pQueue.top();
./Prim.cpp:60:54:错误:“class std::priority_queue”没有名为“top”的成员
std::pair topEdge=pQueue.top();
尝试1(将常量添加到比较器参数):

模板
类边缘比较器{
公众:
布尔运算符()(常数std::pair&lhs,常数std::pair&rhs)常数{

return lhs.second我想我在这里发现了一个微妙的错误:

std::priority_queue<
    std::pair<Edge<T>, int>,
    std::vector<std::pair<Edge<T>, int>,
                                     ^^
    EdgeComparator<T> > > pQueue;
                      ^^^  
std::优先级队列<
std::pair,
std::vector>pQueue;
^^^  
看起来应该是这样的:

std::priority_queue<
    std::pair<Edge<T>, int>,
    std::vector<std::pair<Edge<T>, int> >,
                                      ^^^^
    EdgeComparator<T> > pQueue;
                     ^^^
std::优先级队列<
std::pair,
向量,
^^^^
边缘比较器>PQUE;
^^^
第一个声明不适合我。此外,错误消息表明支持我的建议。请仔细查看:

./Prim.cpp:60:54: error: ‘class std::priority_queue<std::pair<Edge<int>, int>,
std::vector<std::pair<Edge<int>, int>, EdgeComparator<int> >,
std::less<std::pair<Edge<int>, int> > >’ has no member named ‘top’
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/Prim.cpp:60:54:错误:“class std::priority\u queue”没有名为“top”的成员
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

它使用的是标准比较器
std::less
而不是您自己的类
EdgeComparator
。因此,我得出结论,您的声明中缺少比较器模板参数,这是因为它由于缺少角括号而处于错误的位置。

请尝试
const std::pair topEdge=pQueue.top()
您得到的第一条错误消息是正确的。后续的错误消息可能是无意义的,这取决于编译器是如何通过之前的错误消息的。在一系列奇怪的错误消息之后出现的任何事情都不应被认真对待。如果
边缘
不可复制构造(或者其移动构造函数不是
noexcept
),然后
vector
可能无法实例化,然后
priority\u queue::reference
可能无法定义,然后
top
也可能失败。正如Pete所说,请看第一个错误。我的建议解决了问题吗?
std::priority_queue<
    std::pair<Edge<T>, int>,
    std::vector<std::pair<Edge<T>, int> >,
                                      ^^^^
    EdgeComparator<T> > pQueue;
                     ^^^
./Prim.cpp:60:54: error: ‘class std::priority_queue<std::pair<Edge<int>, int>,
std::vector<std::pair<Edge<int>, int>, EdgeComparator<int> >,
std::less<std::pair<Edge<int>, int> > >’ has no member named ‘top’
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^