class vertex;
bool compareVertex(vertex *v1, vertex *v2);
std::priority_queue<vertex *, decltype(compareVertex)*> pq(compareVertex);
上面的代码有什么问题?我已经声明并定义了vertex和compareVertex,但是编译器告诉我:“未知类型名称'pq'”和“必须调用非静态成员函数的引用”
感谢您的阅读。
答案 0 :(得分:0)
您在优先级队列的构造函数中缺少第三个模板参数。
请参阅此post以供参考。
答案 1 :(得分:0)
根据记录here,std::priority_queue
模板的签名为:
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
因此,您需要将基础容器指定为模板参数。您不能依赖默认模板参数,因为您正在尝试指定比较器(第三个模板参数)。此外,我不确定您指定比较器的方式是否正确...您可能希望std::less
专门用于vertex
来使用您的自定义比较功能,并依赖于默认值模板参数。
你可能想试试这个:
class vertex;
bool compareVertex(vertex *v1, vertex *v2);
namespace std {
template<>
struct less <vertex*> {
bool operator() (vertex* lhs, vertex* rhs) const {
return compareVertex(lhs, rhs);
}
};
}
std::priority_queue<vertex*> pq;
请注意,您的less
专精必须在全局或std
命名空间内定义。
修改强>
显然,从评论中,您的compareVertex
函数实际上是某些graph
类的成员函数。
在这种情况下,您可能想要这样做:
struct VertexComparator {
explicit VertexComparator(graph& g)
: graph_(g) {
}
bool operator() (vertex* lhs, vertex* rhs) const {
return graph_.compareVertex(lhs, rhs);
}
private:
graph& graph_;
};
typedef priority_queue<vertex*, vector<vertex*>, VertexComparator> tVertexPriorityQueue;
graph aGraphInstance;
tVertexPriorityQueue pq(VertexComparator(aGraphInstance));