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’
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^