0

我正在尝试使用 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。

4

2 回答 2

2

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

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

boost::phoenix::sort ( boost::phoenix::bind( &std::pair<int, Foo>::second_type::getvalue, boost::phoenix::arg_names::arg1) (*fooVec.begin() ), std::less<int>() );
于 2011-11-08T14:53:11.893 回答
2

正如评论的那样,我认为您从向量创建凤凰演员的方式不能用于对其进行排序,但我从未使用过凤凰的算法,所以我不确定。您当然可以使用 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))
        );
于 2011-11-08T15:30:21.247 回答