0

我有一堂课:

//header file
class CMDatabase
{
    class Try;
    typedef boost::shared_ptr<Try> TryPtr;
    typedef boost::ptr_vector<Try> TryVector;
    typedef TryVector::iterator TryVectorIterator;

    class Try
    {
        public:
            virtual ~Try();
            virtual bool equal(CMDatabase::TryPtr mySd) = 0;
    };
};

//.cpp file

class TryImpl : public CMDatabase::Try
{
    bool equal(CMDatabase::TryPtr mySd)
    {
        //boost::shared_ptr<ServiceDataImpl> ServiceDataImplPtr;
        //const ServiceDataImplPtr pOtherData = dynamic_cast<const ServiceDataImplPtr>(mySd);

        //ServiceDataImpl *pOtherData = dynamic_cast<ServiceDataImpl *>(mySd.get());
        return true;
    }
};

//Another .cpp file

void UpdateClass::TryFind()
{
    CMDatabase::TryVector defaultTry;
    CMDatabase::TryVector updateTry;

//Code for filling two vectors here....

    for(CMDatabase::TryVectorIterator i = defaultTry.begin(); i != defaultTry.end(); ++i)
    {
       CMDatabase::TryVectorIterator it = find_if(updateTry.begin(), updateTry.end(),bind1st(mem_fun(&CMDatabase::Try::equal), *i));

    }
}

当我编译这个时,我得到错误:

错误 1 ​​错误 C2440:“正在初始化”:
无法从“const CMDatabase::Try”转换为“CMDatabase::Try
*”c:\program files\microsoft visual studio 9.0\vc\include\functional 296

谁能告诉我我做错了什么以及如何纠正它。

4

3 回答 3

1

为了完整起见,以下陈述是错误的!感谢 Matthieu M. 指出我的错误!

在取消引用 boost 指针容器的迭代器时,您将获得指向该元素的纯指针。因此,您可以尝试取消引用通过迭代器获得的纯指针:

CMDatabase::TryVectorIterator it =
  find_if(updateTry.begin(), updateTry.end(), bind1st(mem_fun(&CMDatabase::Try::equal), **i));

以下仍然正确的地方;)

或者您可以使用 which 的operator[]实现boost::ptr_vector将返回对元素的引用:

for (std::size_t i = 0, l = ; defaultTry.size(); ++i) {
  CMDatabase::TryVectorIterator it = std::find_if(
    updateTry.begin(),
    updateTry.end(),
    std::bind1st(std::mem_fun(&CMDatabase::Try::equal), defaultTry[i])
  );
}

希望这可以帮助。

于 2010-06-24T09:00:12.027 回答
1

问题是你的equal方法const不合格。

class Try
{
public:
  virtual ~Try();
  virtual bool equal(CMDatabase::TryPtr const& mySd) const = 0;
};

bool TryImpl::equal(CMDatabase::TryPtr const& mySd) const { return true; }

笔记:

  • 添加到const方法中,否则不能用于const对象
  • 添加在const指针上:复制shared_ptr确实需要成本,因为它需要增加一个共享计数器,然后再减少它。

编辑

提醒粗心的人:指针容器库的设计使界面尽可能易于使用,其中一个好处是您不必重复取消引用。这编译:

 boost::ptr_vector<int> vec;
 vec.push_back(new int(3));

 int& i = *vec.begin();

因此,您的仿函数必须引用,而不是指针:)

于 2010-06-24T09:52:31.650 回答
0

抱歉,由于某些原因,我无法对以前的帖子添加评论,所以我将其写为答案。

我尝试了这两种方法。第一个给出,非法间接。

而对于第二个,它给出了同样的错误:在详细输出中,详细信息如下:

c:\program files\microsoft visual studio 9.0\vc\include\functional(296) : error C2440: 'initializing' : cannot convert from 'const CMDatabase::Try' to 'CMDatabase::Try *' No user-defined-可以执行此转换的可用转换运算符,或者不能调用该运算符 c:\fta_chk\tools\channel_editor\ivodb\channellistupdate.cpp(103) :请参阅对函数模板实例化 'std::binder1st<_Fn2> std:: 的引用bind1st,CMDatabase::Try>(const _Fn2 &,const _Ty &)' 正在编译 [ _Fn2=std::mem_fun1_t, _Result=bool, _Ty=CMDatabase::Try, _Arg=CMDatabase::TryPtr ]

于 2010-06-24T09:13:19.967 回答