我有一个函数需要根据一些输入参数返回一个排序列表。我已选择std::priority_queue
来保存此列表。
但是编译器给了我一个我不认识的错误。这是我的代码:
struct DepthCompare {
bool operator()
(const struct inst *&lhs, const struct inst *&rhs) const
{
return lhs->depth < rhs->depth;
}
};
typedef priority_queue<struct inst*> HeuristicList;
HeuristicList getHeuristicList(struct BasicBlock &) {
HeuristicList ret( DepthCompare );
return ret;
}
编译器在return语句的行上说conversion from 'HeuristicList (*)(DepthCompare)' to non-scalar type 'HeuristicList' requested
。
看起来我不想回指针。出了什么问题?
答案 0 :(得分:5)
你有两个问题。
要使用自定义比较器,必须将比较器类型指定为第三个模板参数:
typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList;
HeuristicList ret( DepthCompare );
被解释为函数声明,而不是变量声明,给出了您所看到的错误。您需要传递比较器的实例,并确保它不能被解释为函数声明:
HeuristicList ret = HeuristicList(DepthCompare());
但是,由于构造函数的第一个参数是可选的,并且默认为默认构造的比较器,因此您可以简单地编写
HeuristicList ret;
或者,因为你刚刚立即返回变量,
return HeuristicList();
答案 1 :(得分:0)
请注意,比较器是priority_queue
的第三个模板参数。您必须声明priority_queue
这样的内容:
typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList;
这假设您要使用vector
作为后备容器(默认)。
另请注意,在比较器仿函数中,您希望将参数声明为指针的const引用。你有一个指向const的指针。你想要这个:
bool operator()(inst* const& lhs, inst* const& rhs) const
您也不需要将比较器对象的实例传递给priority_queue
构造函数,因为默认的比较器构造函数可以正常运行。