具有lambda函数错误的优先级队列

时间:2018-04-18 07:48:41

标签: c++ c++11 lambda priority-queue

这是一个班级。 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函数非常不熟悉所以我不知道如何解决这个函数。

错误:比较不是类型

2 个答案:

答案 0 :(得分:2)

成员comparebool,不是函数,它的值为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的成员命名列表,因为列表也是类型。