为什么我不能在C ++ 0x中的std :: shared_ptr的向量上执行std :: copy?

时间:2011-03-09 22:39:55

标签: c++ c++11

我在程序中编写了一个用于处理层次结构路径的路径类。我决定使用std :: shared_ptr作为整个类的标准返回类型,因为我对它非常喜欢。

让我感到惊讶的是,我无法使用std :: copy或普通的vector.insert(v.begin(),v.end())将元素复制到shared_ptr的向量中。这是为什么?

shared_ptr<vector<shared_ptr<bfile>>> butils::bfile::search()
{
    shared_ptr<vector<shared_ptr<bfile>>> ret(new vector<shared_ptr<bfile>>());
    shared_ptr<vector<shared_ptr<bfile>>> children = getChildren();

    //WTF why don't either of these work?
    //std::copy(children->begin(), children->end(), back_inserter(ret));
    //ret->insert(children->begin(), children->end());

    //I've had to resort to doing this....
    for (auto c = children->begin(); c != children->end(); c++)
    {
        ret->push_back(*c);
        auto cChildren = (*c)->search();
        for (auto cc = cChildren->begin(); cc != cChildren->end(); cc ++)
        {
            ret->push_back(*cc);
        }
    }

    return ret;
}

当我尝试std :: copy()时,我得到了:

  

1&gt; C:\ Program Files(x86)\ Microsoft   视觉工作室   10.0 \ VC \ include \ iterator(21):错误C2039:'const_reference':不是   'std :: tr1 :: shared_ptr&lt; _Ty&gt;'的成员   1 GT;用1> [1>   _Ty =标准::矢量&GT;   1 GT; ] 1&gt;
  BFile.cpp(329):参见参考资料   类模板实例化   '的std :: back_insert_iterator&LT; _container&GT;'   正在编译1&gt; 1 >>   [1>   _container =标准:: TR1 :: shared_ptr的&GT;&GT;   1 GT; ]

当我尝试插入(v.begin(),v.end())时,我得到了;

1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(208): error C2664: 'std::tr1::shared_ptr<_Ty>::shared_ptr(std::nullptr_t)' : cannot convert parameter 1 from 'std::_Vector_iterator<_Myvec>' to 'std::nullptr_t'
1>          with
1>          [
1>              _Ty=butils::bfile
1>          ]
1>          and
1>          [
1>              _Myvec=std::_Vector_val<std::tr1::shared_ptr<butils::bfile>,std::allocator<std::tr1::shared_ptr<butils::bfile>>>
1>          ]

我不确定我是否理解这些编译错误......其他人都有线索吗?

3 个答案:

答案 0 :(得分:9)

你试图向指向矢量的指针back_inserter而不是矢量本身。将back_inserter(ret)更改为back_inserter(*ret)(如果您确实需要动态分配此类向量)。

insert失败了,因为你错过了一个论点:

ret->insert(ret->begin(), children->begin(), children->end());

奇怪的错误消息是因为insert存在2个参数的重载,第二个参数是要插入的对象。编译器尝试使用它,但无法将迭代器转换为对象类型。

答案 1 :(得分:2)

std::back_inserter需要一个序列,而不是std::shared_ptr。使用back_inserter(*ret)

对于第二个,insert()需要第三个参数:insert(where_to_insert,start,end)

答案 2 :(得分:0)

考虑使用std :: transform代替std :: copy。

PrimeNG 8