c++ - boost::ptr_vector 和 find_if

标签 c++ boost ptr-vector

我有一个类:

//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));

    }
}

编译时出现错误:

Error 1 error C2440: 'initializing' :
cannot convert from 'const CMDatabase::Try' to 'CMDatabase::Try
*' c:\program files\microsoft visual studio 9.0\vc\include\functional 296

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

最佳答案

问题是您的 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 会产生成本,因为它需要递增一个共享计数器,然后再递减它。

编辑:

提醒粗心的人:Pointer Container 库的设计使界面尽可能易于使用,其中一个优点是您不必重复取消引用。这编译:

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

 int& i = *vec.begin();

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

关于c++ - boost::ptr_vector 和 find_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3108388/

相关文章:

c# - WPF 与 C++,这可能吗?

c++ - Boost网络不在标准boost安装中

c++ - 如何从 boost::ptr_vector 中删除元素

c++ - std::find_if 中的编译错误

c++ - 对值读取错误 C++

c++ - 如何为 std::shared_ptr<PureVirtualClass> 传递默认参数

sorting - boost 弹性聚集结果

c++ - 如何使用常规 makefile 构建依赖于 boost 的项目?

c++ - OS X Mavericks 上 gtest 的链接器错误