免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7436 | 回复: 2
打印 上一主题 下一主题

[C++] 请教一个vector的find_if的使用问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-27 22:27 |只看该作者 |倒序浏览
请教一个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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-10-28 16:26 |只看该作者
你vector的元素类型是 BaseOrder*  而你比较函数对象的参数类型是BaseOrder& (bool operator()(const BaseOrder& CurOrder) const )  所以类型不匹配....

论坛徽章:
0
3 [报告]
发表于 2009-10-29 19:25 |只看该作者
感谢2楼 dhb118 的指点!!!

根据2楼的提示,将对BaseOrder的引用改成了对BaseOrder指针的引用,就可以编译通过了.。

再次感谢 dhb118 同学,呵呵.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP