我有一个类:
//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/