2

我有一个函数需要根据一些输入参数返回一个排序列表。我选择了一个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;
}

conversion from 'HeuristicList (*)(DepthCompare)' to non-scalar type 'HeuristicList' requested 编译器在 return 语句的行上说 a 。

看起来我并没有试图返回一个指针。怎么了?

4

2 回答 2

5

你有两个问题。

要使用自定义比较器,您必须将比较器类型指定为第三个模板参数:

typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList;

HeuristicList ret( DepthCompare );被解释为函数声明,而不是变量声明,从而给出您所看到的错误。您需要传递一个比较器的实例,并确保它不能被解释为函数声明:

HeuristicList ret = HeuristicList(DepthCompare());

但是,由于构造函数的第一个参数是可选的,并且默认为默认构造的比较器,因此您可以简单地编写

HeuristicList ret;

或者,由于您只是立即返回变量,

return HeuristicList();
于 2010-12-03T19:33:44.190 回答
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构造函数,因为默认的比较器构造函数就可以了。

于 2010-12-03T19:11:33.453 回答