C++ boost::phoenix::排序错误

C++ boost::phoenix::排序错误,c++,boost,stl,boost-bind,boost-phoenix,C++,Boost,Stl,Boost Bind,Boost Phoenix,我正在尝试使用boost::phoenix库对下面的向量进行排序。类Foo有一个成员函数“int getvalue()”。其目的是使用“getvalue()”返回的值对向量进行排序。但是缺少了一些东西。我得到的编译器错误为“::second不是类或命名空间” std::vector<std::pair<int, Foo> > fooVec; boost::phoenix::sort ( boost::phoenix::bind( &std

我正在尝试使用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>() );
std::vector fooVec;
boost::phoenix::sort(boost::phoenix::bind(&std::pair::second::getvalue(),boost::phoenix::arg_names::arg1)(*fooVec.begin()),std::less());
谁能解释一下吗。我需要进行哪些更改才能使其正常工作

谢谢


PS:我知道我可以使用function object/lambda或类似的soemthing,但我想试试boost::phoenix

这正是错误消息所说的
std::pair::second
是数据成员,而不是类或命名空间,因此不能对其使用运算符

您可以使用
second\u 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>() );
boost::phoenix::sort(boost::phoenix::bind(&std::pair::second_type::getvalue,boost::phoenix::arg_names::arg1)(*fooVec.begin()),std::less());

这正是错误消息所说的
std::pair::second
是数据成员,而不是类或命名空间,因此不能对其使用运算符

您可以使用
second\u 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>() );
boost::phoenix::sort(boost::phoenix::bind(&std::pair::second_type::getvalue,boost::phoenix::arg_names::arg1)(*fooVec.begin()),std::less());

如评论所述,我不认为你用向量创建phoenix actor的方法可以对其进行排序,但我从未使用phoenix的算法,所以我不确定。 当然,您可以使用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::placeholders::arg1,boost::phoenix::placeholders::arg2)(fooVec,
boost::phoenix::bind(&Foo::getvalue,boost::phoenix::bind(&std::pair::second,boost::phoenix::placeholders::arg1))
如评论所述,我不认为你用向量创建phoenix actor的方法可以对其进行排序,但我从未使用phoenix的算法,所以我不确定。 当然,您可以使用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::placeholders::arg1,boost::phoenix::placeholders::arg2)(fooVec,
boost::phoenix::bind(&Foo::getvalue,boost::phoenix::bind(&std::pair::second,boost::phoenix::placeholders::arg1))
我认为这不会对向量进行排序。第一个参数必须是要排序的范围。既然你用它做了一个凤凰表达式,你的向量就不会改变。你能告诉我正确的方法吗。谢谢…我添加了一个答案,并举例说明如何在本例中使用phoenix。但它与您的方法不同,因为我不能再使用std::less了。但也许会有帮助。我不认为这会对向量进行排序。第一个参数必须是要排序的范围。既然你用它做了一个凤凰表达式,你的向量就不会改变。你能告诉我正确的方法吗。谢谢…我添加了一个答案,并举例说明如何在本例中使用phoenix。但它与您的方法不同,因为我不能再使用std::less了。但也许它会有帮助。谢谢你的回答,但不幸的是,它不起作用。我也犯了同样的错误。错误:“getvalue”不是“std::pair::second_type”的成员这意味着类
Foo
没有名为
getvalue()
的方法。当然,我不知道该类的成员是什么,但我希望您知道。哦,对不起,您必须删除
()
(要获取指向函数的指针,只使用其名称,不要调用它)。答案已重新编辑。仍然不起作用。错误:“getvalue”不是“std::pair::second_type”的成员,那么您可能需要在
std::pair::second_type
之前使用
typename
。不管怎么说,既然mkaes的答案解决了你的问题,我认为不值得继续批评。谢谢你的答案,但不幸的是,它不起作用。我也犯了同样的错误。错误:“getvalue”不是“std::pair::second_type”的成员这意味着类
Foo
没有名为
getvalue()
的方法。当然,我不知道该类的成员是什么,但我希望您知道。哦,对不起,您必须删除
()
(要获取指向函数的指针,只使用其名称,不要调用它)。答案已重新编辑。仍然不起作用。错误:“getvalue”不是“std::pair::second_type”的成员,那么您可能需要在
std::pair::second_type
之前使用
typename
。不管怎么说,既然mkaes的答案解决了你的问题,我认为不值得继续打破僵局;使用boost::phoenix::arg_name::arg1;int数组[]={3,1,2};std::列表测试列表(数组,数组+3);boost::phoenix::sort(arg1,std::greater())(测试列表);这是作为boost::phoenix库参考的示例。我在跟踪它。谢谢你的回答。@Pavan:这正是我的意思。它们作为第一个参数传入容器。您传入一个phoenix表达式作为第一个参数。这不会对容器进行排序;使用boost::phoenix::arg_name::arg1;int数组[]={3,1,2};std::列表测试列表(数组,数组+3);促进