【问题标题】:boost::phoenix::sort errorboost::phoenix::sort 错误
【发布时间】:2011-11-08 14:24:18
【问题描述】:

我正在尝试使用 boost::phoenix 库对下面的向量进行排序。 Foo 类有一个成员函数'int getvalue()'。目的是使用“getvalue()”返回的值对向量进行排序。但是缺少一些东西。我收到编译器错误,因为“::second 不是类或命名空间”

      std::vector<std::pair<int, Foo> > fooVec;

      boost::phoenix::sort ( boost::phoenix::bind( &std::pair<int, Foo>::second::getvalue(), boost::phoenix::arg_names::arg1) (*fooVec.begin() ), std::less<int>() );

谁能解释一下。我需要进行哪些更改才能完成这项工作?

谢谢。

PS:我知道我可以使用函数对象/lambda 或类似的东西,但我想尝试 boost::phoenix。

【问题讨论】:

  • 我认为这不会对您的向量进行排序。第一个参数必须是要排序的范围。既然你用它做了一个凤凰表情,你的向量就不会改变。
  • 你能告诉我正确的方法吗?谢谢...
  • 我添加了一个答案,并举例说明了在这种情况下我将如何使用 phoenix。但这与您的方法不同,因为我不能再使用 std::less 了。但也许有帮助。

标签: c++ boost stl boost-bind boost-phoenix


【解决方案1】:

正如评论的那样,我认为您从向量创建凤凰演员的方式不能用于对其进行排序,但我从未使用过凤凰的算法,所以我不确定。 您当然可以使用 sort 并使用 phoenix 创建一个仿函数来对其进行排序。
所以我建议以这种方式使用凤凰。

boost::phoenix::sort(boost::phoenix::placeholders::arg1, boost::phoenix::placeholders::arg2)(fooVec, 
        boost::phoenix::bind( &Foo::getvalue, boost::phoenix::bind( &std::pair<int, Foo>::second, boost::phoenix::placeholders::arg1)) < boost::phoenix::bind( &Foo::getvalue, boost::phoenix::bind( &std::pair<int, Foo>::second, boost::phoenix::placeholders::arg2))
        );

【讨论】:

  • 使用 boost::phoenix::sort;使用 boost::phoenix::arg_names::arg1;整数数组[] = {3,1,2}; std::list test_list(array, array + 3); boost::phoenix::sort(arg1, std::greater())(test_list);这是 boost::phoenix 库的参考示例。我跟着它。不过感谢您的回答。
  • @Pavan:这正是我的意思。它们作为第一个参数传入容器。你传入一个凤凰表达式作为第一个参数。这不会对您的容器进行排序。
【解决方案2】:

这正是错误消息所说的。 std::pair&lt;int, Foo&gt;::second 是数据成员,而不是类或命名空间,因此不能在其上使用运算符 ::

您可以使用second_type 代替second,它是typedef,表示对中第二个元素的类型:

boost::phoenix::sort ( boost::phoenix::bind( &std::pair<int, Foo>::second_type::getvalue, boost::phoenix::arg_names::arg1) (*fooVec.begin() ), std::less<int>() );

【讨论】:

  • 感谢您的回答,但不幸的是它不起作用。我犯了同样的错误。错误:“getvalue”不是“std::pair::second_type”的成员
  • 这意味着Foo 类没有名为getvalue() 的方法。当然,我不知道那个班级的成员是什么,但我希望你知道。
  • 哦,对不起,您必须删除()(要获得指向函数的指针,只使用它的名称,不要调用它)。答案再次编辑。
  • 还是不行。错误:“getvalue”不是“std::pair::second_type”的成员
  • 那么您可能需要在std::pair&lt;int, Foo&gt;::second_type 之前使用typename。无论如何,既然 mkaes 的回答解决了你的问题,我认为不值得继续打败灌木丛。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
相关资源
最近更新 更多