2010-12-03 76 views
2

我有一个函数需要根据一些输入参数返回一个排序列表。我已选择一个std::priority_queue来保存此列表。用自定义比较器返回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

它看起来不像我试图返回一个指针。出了什么问题?

回答

5

你有两个问题。

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

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

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

HeuristicList ret = HeuristicList(DepthCompare()); 

然而,由于constuctor的第一个参数是可选的,默认为缺省构造比较,你可以简单地写

HeuristicList ret; 

或者,因为你只是返回变量直线距离,

return HeuristicList(); 
+0

谢谢。为了理解这一切,我有更多的阅读需要做。来自Java,我几次绕过匿名对象,并认为C++将是相同的方式。当然,为了清楚起见,我省略了`getHeuristicList()`的主体,所以我不会立即返回它。 我也需要手册来解释gcc的错误信息! – Mike 2010-12-04 17:45:57

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构造,作为默认的构造比较会做就好了。