C++ boost::ptr_向量并查找_if
我有一门课:C++ boost::ptr_向量并查找_if,c++,boost,ptr-vector,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:
//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));
}
}
//头文件
类CMDatabase
{
班级尝试;
typedef boost::shared_ptr TryPtr;
typedef boost::ptr_向量TryVector;
typedef TryVector::迭代器TryVector迭代器;
课堂尝试
{
公众:
虚拟~Try();
虚拟布尔相等(CMDatabase::TryPtr mySd)=0;
};
};
//.cpp文件
类TryImpl:public CMDatabase::Try
{
bool equal(CMDatabase::TryPtr mySd)
{
//boost::shared_ptr servicedataimpltr;
//const servicedataimpptr pOtherData=dynamic_cast(mySd);
//ServiceDataImpl*pOtherData=dynamic_cast(mySd.get());
返回true;
}
};
//另一个.cpp文件
void UpdateClass::TryFind()
{
CMDatabase::TryVector defaultTry;
CMDatabase::TryVector Updatery;
//这里填充两个向量的代码。。。。
对于(CMDatabase::TryVectorIterator i=defaultTry.begin();i!=defaultTry.end();++i)
{
CMDatabase::TryVectorIterator it=find_if(updatery.begin()、updatery.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
有谁能告诉我我做错了什么以及如何纠正它。为了完整起见,下面的陈述是错误的!感谢Matthieu M.指出我的错误强> 在取消对boost指针容器的迭代器的引用时,您将获得指向该元素的纯指针。因此,您可以尝试取消引用通过迭代器获得的纯指针:
CMDatabase::TryVectorIterator it =
find_if(updateTry.begin(), updateTry.end(), bind1st(mem_fun(&CMDatabase::Try::equal), **i));
以下内容仍然正确;)强> 或者您可以使用
操作符[]
实现boost::ptr_向量
,该向量将返回对元素的引用:
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])
);
}
希望这能有所帮助。很抱歉,由于soem的原因,我无法在上一篇文章中添加评论,所以我将其作为答案 我两种方法都试过了。 首先,非法间接行为 对于第二个,它给出了相同的错误: 在详细输出中,详细信息如下: c:\program files\microsoft visual studio 9.0\vc\include\functional(296):错误C2440:“正在初始化”:无法从“const CMDatabase::Try”转换为“CMDatabase::Try*” 没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符 c:\fta\u chk\tools\channel\u editor\ivodb\channellistupdate.cpp(103):请参阅正在编译的函数模板实例化“std::binder1st std::bind1st,CMDatabase::Try>(const(const)Fn2&,const(Ty) 具有 [ _Fn2=std::mem\u fun1\t, _结果=布尔, _Ty=CMDatabase::Try, _Arg=CMDatabase::TryPtr
]问题是您的
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
- 指针上添加的
:复制常数
确实需要花费,因为它需要增加一个共享计数器,然后再减少它shared_ptr
boost::ptr_vector<int> vec;
vec.push_back(new int(3));
int& i = *vec.begin();
boost::ptr_向量向量向量;
向量推回(新整数(3));
int&i=*vec.begin();
因此,您的函子必须采用引用,而不是指针:)您不能将所有代码放在
块中吗?这将使它更具可读性:)不需要标记,标记语法支持代码块缩进4个空格。也可以选择代码并点击010
按钮@elrYou没有足够的声誉发表评论:这需要15分。@Matthieu:用户应该始终能够对自己的问题发表评论。我知道他们可以对自己的问题发表评论,但我不确定他们是否可以对回复发表评论…@Matthieu:这就是我的意思:)常见问题解答有一个要点:“即使有1名代表,您也可以随时对您的问题和答案以及您所问问题的任何答案发表评论。”起初,我认为这个答案是有价值的,但它并没有解决从CMDatabase::Try到CMDatabase::Try*(指针)的无效转换问题没有这样的问题。您也使用boost::ptr_vector
作为它的接口:CMDatabase::Try&t=*it
。这就是为什么错误消息甚至没有提到它的原因。+1这个答案似乎更符合所描述的错误。不幸的是,它不是。将迭代器解引用到boost.Pointer容器中会产生一个引用对对象的引用,而不是指向对象的指针,这样就不必双重取消引用。这是接口优点的一部分。