【发布时间】: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<Edge<T>, int> topEdge = pQueue.top(); -
你得到的第一条错误信息是正确的。随后的错误消息可能是无稽之谈,这取决于编译器为克服早期错误消息所做的工作。不应该认真对待一连串奇怪的错误消息之后出现的任何事情。
-
如果
Edge不是可复制构造的(或者它的移动构造函数不是noexcept),那么vector可能无法实例化,然后priority_queue::reference可能无法定义,并且那么top也可能会失败。正如皮特所说,看到第一个错误。 -
我的建议解决了问题吗?
标签: c++ templates stl priority-queue comparator