- 论坛徽章:
- 0
|
请教一个vector的find_if的使用问题
我用C++写了一个根据单据类(即:BaseOrder)中的来源编码字段(即:SourceID),在标准单据库(即:StdOrders)中查找指定单据,并把查到的单据存放到目标单据库(即:TargetOrders)中的代码。其中,数据的组织格式用到了vector,查寻时用到了vector的find_if功能(代码如下),但是,在编译的时候却通不过,不知道是什么原因,希望高手们能指点一下......
(注1:开发平台为:Ubuntu8.10 + Codeblocks + wxWidgets2.8 + wxFormbuilder)
(注2:尽管平台不同,但是,自认为查寻部分的代码是按C++的标准来编写的,大家如有不认可的地方,也欢迎指出,呵呵....)
//==========================================
// 定义部分
//==========================================
//定义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的实际应用类
class MyOrderDlg: public GUIDialog
{
public:
MyOrderDlg(wxDialog *dlg);
~MyOrderDlg();
private:
void __AppendToOrdersByID(int CurID, tagCommonOrders CurTargetOrders, tagCommonOrders CurStdOrders);
}
//==========================================
// 代码部分
//==========================================
//根据ID从标准的Orders中寻找合适的Order,并将它放入目标Orders中
void MyOrderDlg::__AppendToOrdersByID(int CurID, tagCommonOrders CurTargetOrders, tagCommonOrders CurStdOrders)
{
tagCommonOrdersIterator ri = CurStdOrders.begin(); //准备好标准Orders的迭代器
while(ri!=CurStdOrders.end()){
ri = find_if(ri, CurStdOrders.end(), FindBaseOrderByID(CurID)); // 根据CurID在标准Orders中查找Order,注:这是编译输出信息中提到的第488行
if(ri!=CurStdOrders.end()){ //如果找到了
CurTargetOrders.push_back(*ri); //就把它存入目标Orders中
ri++; //准备查寻下一个
}
}
}
//==========================================
// 编译时的输出信息
//==========================================
||=== 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*& ) ’的调用没有匹配|
/home/yanyan/myprojs/MyOrderDlg.h|121|附注: 备选为: bool FindBaseOrderByID :: operator() ( const BaseOrder& ) const|
/usr/include/c++/4.3/bits/stl_algo.h|230|错误: 对‘(FindBaseOrderByID) (BaseOrder*& ) ’的调用没有匹配|
/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; };
结果,错误又变成了:
/home/yanyan/myprojs/MyOrderDlg.cpp|488|错误: 对‘FindBaseOrderByID::FindBaseOrderByID(int)’的调用没有匹配的函数|
/home/yanyan/myprojs/MyOrderDlg.h|121|附注: 备选为: FindBaseOrderByID::FindBaseOrderByID(const BaseOrder& ) |
/home/yanyan/myprojs/MyOrderDlg.h|115|附注: FindBaseOrderByID::FindBaseOrderByID(const FindBaseOrderByID& ) |
请问,上面程序的问题在哪里?怎样根据成员变量,用find_if来查询vector中的某个值?
谢谢!!!
[ 本帖最后由 mrguo 于 2009-10-27 22:54 编辑 ] |
|