- 論壇徽章:
- 0
|
請教一個vector的find_if的使用問題
我用C++寫了一個根據(jù)單據(jù)類(即:BaseOrder)中的來源編碼字段(即:SourceID),在標(biāo)準(zhǔn)單據(jù)庫(即:StdOrders)中查找指定單據(jù),并把查到的單據(jù)存放到目標(biāo)單據(jù)庫(即:TargetOrders)中的代碼。其中,數(shù)據(jù)的組織格式用到了vector,查尋時用到了vector的find_if功能(代碼如下),但是,在編譯的時候卻通不過,不知道是什么原因,希望高手們能指點一下......
(注1:開發(fā)平臺為:Ubuntu8.10 + Codeblocks + wxWidgets2.8 + wxFormbuilder)
(注2:盡管平臺不同,但是,自認(rèn)為查尋部分的代碼是按C++的標(biāo)準(zhǔn)來編寫的,大家如有不認(rèn)可的地方,也歡迎指出,呵呵....)
//==========================================
// 定義部分
//==========================================
//定義Order
class BaseOrder;
typedef vector<BaseOrder*> tagCommonOrders;
typedef vector<BaseOrder*>::iterator tagCommonOrdersIterator;
class BaseOrder
{
private:
int SourceID;
public:
BaseOrder(int CurSourceID);
int GetSourceID(){return SourceID;};
};
//定義Order的查尋類
class FindBaseOrderByID
{
private:
int SourceID;
public:
FindBaseOrderByID(const int CurSourceID):SourceID(CurSourceID) { };
bool operator()(const BaseOrder& CurOrder) const { return (( ( BaseOrder& ) CurOrder).GetSourceID()) == SourceID; }; //注:這是編譯輸出信息中提到的第121行
};
//定義Order的實際應(yīng)用類
class MyOrderDlg: public GUIDialog
{
public:
MyOrderDlg(wxDialog *dlg);
~MyOrderDlg();
private:
void __AppendToOrdersByID(int CurID, tagCommonOrders CurTargetOrders, tagCommonOrders CurStdOrders);
}
//==========================================
// 代碼部分
//==========================================
//根據(jù)ID從標(biāo)準(zhǔn)的Orders中尋找合適的Order,并將它放入目標(biāo)Orders中
void MyOrderDlg::__AppendToOrdersByID(int CurID, tagCommonOrders CurTargetOrders, tagCommonOrders CurStdOrders)
{
tagCommonOrdersIterator ri = CurStdOrders.begin(); //準(zhǔn)備好標(biāo)準(zhǔn)Orders的迭代器
while(ri!=CurStdOrders.end()){
ri = find_if(ri, CurStdOrders.end(), FindBaseOrderByID(CurID)); // 根據(jù)CurID在標(biāo)準(zhǔn)Orders中查找Order,注:這是編譯輸出信息中提到的第488行
if(ri!=CurStdOrders.end()){ //如果找到了
CurTargetOrders.push_back(*ri); //就把它存入目標(biāo)Orders中
ri++; //準(zhǔn)備查尋下一個
}
}
}
//==========================================
// 編譯時的輸出信息
//==========================================
||=== MyOrderDlg, Debug ===|
/usr/include/c++/4.3/bits/stl_algo.h||In function ‘_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<BaseOrder**, std::vector<BaseOrder*, std::allocator<BaseOrder*> > >, _Predicate = FindBaseOrderByID]’ : |
/usr/include/c++/4.3/bits/stl_algo.h|3837|instantiated from ‘_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal_iterator<BaseOrder**, std::vector<BaseOrder*, std::allocator<BaseOrder*> > >, _Predicate = FindBaseOrderByID]’|
/home/yanyan/myprojs/MyOrderDlg.cpp|488|instantiated from here|
/usr/include/c++/4.3/bits/stl_algo.h|226|錯誤: 對‘(FindBaseOrderByID) (BaseOrder*& ) ’的調(diào)用沒有匹配|
/home/yanyan/myprojs/MyOrderDlg.h|121|附注: 備選為: bool FindBaseOrderByID :: operator() ( const BaseOrder& ) const|
/usr/include/c++/4.3/bits/stl_algo.h|230|錯誤: 對‘(FindBaseOrderByID) (BaseOrder*& ) ’的調(diào)用沒有匹配|
/home/yanyan/myprojs/MyOrderDlg.h|121|附注: 備選為: bool FindBaseOrderByID :: operator() ( const BaseOrder& ) const|
......
||=== Build finished: 14 errors, 0 warnings ===|
======================================================================
后來,我將 121 行那段改成了下面這樣,然后又再試了一下:
FindBaseOrderByID(const BaseOrder& CurOrder) { SourceID = (( BaseOrder& ) CurOrder).GetSourceID(); };
bool operator()(const int& CurSourceID) const { return CurSourceID == SourceID; };
結(jié)果,錯誤又變成了:
/home/yanyan/myprojs/MyOrderDlg.cpp|488|錯誤: 對‘FindBaseOrderByID::FindBaseOrderByID(int)’的調(diào)用沒有匹配的函數(shù)|
/home/yanyan/myprojs/MyOrderDlg.h|121|附注: 備選為: FindBaseOrderByID::FindBaseOrderByID(const BaseOrder& ) |
/home/yanyan/myprojs/MyOrderDlg.h|115|附注: FindBaseOrderByID::FindBaseOrderByID(const FindBaseOrderByID& ) |
請問,上面程序的問題在哪里?怎樣根據(jù)成員變量,用find_if來查詢vector中的某個值?
謝謝。。
[ 本帖最后由 mrguo 于 2009-10-27 22:54 編輯 ] |
|