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

Ben*_*enj 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

1> C:\ Program Files(x86)\ Microsoft Visual Studio 10.0\VC\include\iterator(21):错误C2039:'const_reference':不是'std :: tr1 :: shared_ptr <_Ty>'1的成员> with 1> [1>
_Ty = std :: vector> 1>] 1>
BFile.cpp(329):参见类模板实例化'std :: back_insert_iterator <_Container>'正在编译1> 1>
[1 >
_Container = std :: tr1 :: shared_ptr >> 1>]

当我尝试插入(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>          ]
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*our 9

你试图对back_inserter指向矢量的指针,而不是矢量本身.更改back_inserter(ret)back_inserter(*ret)(如果你真的觉得动态分配矢量这样的需要).

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

ret->insert(ret->begin(), children->begin(), children->end());
Run Code Online (Sandbox Code Playgroud)

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