这是一个班级。 B类有一个清单。
class A{
bool compare = [](const B& lhs, const B& rhs){
return lhs.list.size() >= rhs.list.size();
};
priority_queue<B, vector<B>, decltype(compare)> pq(compare);
};
我在pq上遇到任何错误。我对lambda函数非常不熟悉所以我不知道如何解决这个函数。
错误:比较不是类型
答案 0 :(得分:2)
成员compare
是bool
,不是函数,它的值为true
。从lambda类型到bool(*)(const B&, const B&)
的隐式转换,然后从函数指针类型转换为bool
。如果要向捕获列表添加任何内容,那么该行将失败,因为有状态的lambdas不会转换为函数指针。
您不能声明数据成员auto
,因此如果您希望它是lambda,则它不能在类范围内。但是你不需要它,静态函数可以正常工作。
class A{
static bool compare(const B& lhs, const B& rhs) {
return lhs.list.size() >= rhs.list.size();
};
std::priority_queue<B, std::vector<B>, decltype(compare)> pq;
public:
A():pq(compare){}
};
答案 1 :(得分:-2)
需要改变几件事。首先,lambda声明很奇怪。 Lambdas最后给出了它们的返回值(我认为它是允许的,但在我看来可能会被解读为试图将lambda分配给bool变量。
其次,我无法对捕获lambda的实际类型的auto或类似关键字做同样的事情,因为这意味着静态constexpr与你的东西相差甚远。
因此,我明确地为lambda提供了一个好的类型(注意lambda的类型总是很奇怪,所以在很多情况下,如果你想要可读的错误消息,将lambda分配给std :: function&lt;&gt;会更好这几乎不是问题。如果你不知道签名,你很可能必须对它进行模板化。但是,带有lambda的类也将被模板化,并且没有问题。
最后,带有元素的队列的初始化是错误的,因为可能很难以正确的顺序构造所有对象。因此,初始化已移至A的构造函数。
这是我的更正:
#include<queue>
#include<list>
#include<vector>
#include<functional>
using namespace std;
struct B{
std::list<int> list;
};
class A{
function<bool(const B&, const B&)> compare = [](const B& lhs, const B& rhs) ->bool{
return lhs.list.size() >= rhs.list.size();
};
std::priority_queue<B, vector<B>, decltype(compare)> pq;
A():pq(compare){}
};
int main()
{
}
最后,请注意我不喜欢B的成员命名列表,因为列表也是类型。