Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::ptr_向量并查找_if_C++_Boost_Ptr Vector - Fatal编程技术网

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容器中会产生一个引用对对象的引用,而不是指向对象的指针,这样就不必双重取消引用。这是接口优点的一部分。