2011-11-08 71 views
0

我想使用boost :: phoenix庫對一個向量進行排序。 Foo類有一個成員函數'int getvalue()'。目的是使用'getvalue()'返回的值對矢量進行排序。但缺少一些東西。因爲':: second不是類或命名空間',所以我得到編譯器錯誤boost :: phoenix ::排序錯誤

 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或soemthing類似,但我想嘗試boost :: phoenix。

+0

我不認爲這會排序你的向量。第一個參數必須是要排序的範圍。既然你做了一個鳳凰表達式,你的向量不會被改變。 – mkaes

+0

您能否如此善待我告訴我正確的做法。謝謝... – polapts

+0

我添加了一個例子,我將如何使用phoenix在這種情況下的答案。但它不同於你的方法,因爲我不能再使用std :: less了。但也許它有幫助。 – mkaes

回答

2

至於評論,我不認爲你創造一個鳳凰的方式你的矢量中的actor可以用來對它進行排序,但我從來沒有使用鳳凰的算法,所以我不確定它。 你當然可以使用排序並用鳳凰創建一個函數來對它進行排序。
所以我建議使用鳳凰這種方式。

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)) 
     ); 
+0

使用boost :: phoenix :: sort; 使用boost :: phoenix :: arg_names :: arg1; int array [] = {3,1,2}; std :: list test_list(array,array + 3); boost :: phoenix :: sort(arg1,std :: greater ())(test_list);這是作爲boost :: phoenix庫參考的例子。我正在關注它。儘管感謝您的回答。 – polapts

+0

哎呀..我不知道如何正確格式化.. – polapts

+0

@Pavan:這正是我的意思。作爲第一個參數,它們通過容器傳遞。作爲第一個參數,你傳遞了一個鳳凰表達式。這不會分揀你的容器。 – mkaes

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>()); 
+0

所以我怎樣才能使它成功地工作? – polapts

+0

我會更新我的答案以顯示它。 – Gorpik

+0

感謝您的答案,但不幸的是它不起作用。我犯了同樣的錯誤。錯誤:'getvalue'不是'std :: pair :: second_type'的成員 – polapts