Priority Queue没有名为top()的成员?

时间:2016-01-31 03:16:14

标签: 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;
        }
};

这是我的优先级队列init:

//Initialize the priority queue
std::priority_queue<
    std::pair<Edge<T>,int>,
    std::vector<std::pair<Edge<T>,int>,
    EdgeComparator<T>> 
> pQueue;

这是错误发生的地方 - 在关于预编译器的奇怪错误消息流之后:

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();

ATTEMPT 1(为比较器参数添加了const):

template <class T>
class EdgeComparator{
    public:
        bool operator()(const std::pair<Edge<T>, int>& lhs, const std::pair<Edge<T>, int>& rhs) const{
            return lhs.second <= rhs.second;
        }
};

1 个答案:

答案 0 :(得分:0)

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

std::priority_queue<
    std::pair<Edge<T>, int>,
    std::vector<std::pair<Edge<T>, int>,
                                     ^^
    EdgeComparator<T> > > pQueue;
                      ^^^  

看起来应该这样:

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

它使用标准比较器std::less<>而不是您自己的班级EdgeComparator<>。因此,我得出结论,你的声明中缺少比较器模板参数,这是因为它由于缺少角度支撑而位于错误的位置。