【问题标题】:Priority Queue has no member named top()?优先队列没有名为 top() 的成员?
【发布时间】:2016-05-08 16:30:56
【问题描述】:

这是我的比较器类:

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;
        }
};

这是我的优先队列初始化:

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

尝试 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;
        }
};

【问题讨论】:

  • 试试const std::pair&lt;Edge&lt;T&gt;, int&gt; topEdge = pQueue.top();
  • 你得到的第一条错误信息是正确的。随后的错误消息可能是无稽之谈,这取决于编译器为克服早期错误消息所做的工作。不应该认真对待一连串奇怪的错误消息之后出现的任何事情。
  • 如果Edge 不是可复制构造的(或者它的移动构造函数不是noexcept),那么vector 可能无法实例化,然后priority_queue::reference 可能无法定义,并且那么top 也可能会失败。正如皮特所说,看到第一个错误。
  • 我的建议解决了问题吗?

标签: c++ templates stl priority-queue comparator


【解决方案1】:

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

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&lt;&gt; 而不是您自己的类EdgeComparator&lt;&gt;。因此,我得出结论,您的声明中缺少比较器模板参数,那是因为缺少角括号,它处于错误的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2017-04-11
    • 2010-12-26
    • 2011-12-25
    相关资源
    最近更新 更多