这个关于声明的c ++代码有什么问题?

时间:2014-03-28 03:09:33

标签: c++ priority-queue decltype

class vertex;
bool compareVertex(vertex *v1, vertex *v2);
std::priority_queue<vertex *, decltype(compareVertex)*> pq(compareVertex);

上面的代码有什么问题?我已经声明并定义了vertex和compareVertex,但是编译器告诉我:“未知类型名称'pq'”和“必须调用非静态成员函数的引用”

感谢您的阅读。

2 个答案:

答案 0 :(得分:0)

您在优先级队列的构造函数中缺少第三个模板参数。

请参阅此post以供参考。

答案 1 :(得分:0)

根据记录herestd::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));