gpt4 book ai didi

c++ - 为什么我不能在 C++0x 中对 std::shared_ptr 的 vector 执行 std::copy?

转载 作者:太空狗 更新时间:2023-10-29 23:37:43 25 4
gpt4 key购买 nike

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

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

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>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\iterator(21): error C2039: 'const_reference' : is not a member of 'std::tr1::shared_ptr<_Ty>' 1> with 1> [ 1>
_Ty=std::vector> 1> ] 1>
BFile.cpp(329) : see reference to class template instantiation 'std::back_insert_iterator<_Container>' being compiled 1> with 1>
[ 1>
_Container=std::tr1::shared_ptr>> 1> ]

当我尝试 insert(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> ]

我不确定我是否理解这些编译器错误中的任何一个...还有其他人有线索吗?

最佳答案

您正在尝试使 back_inserter 指向 vector 的指针,而不是 vector 本身。将 back_inserter(ret) 更改为 back_inserter(*ret)(如果您真的觉得需要像那样动态分配 vector )。

insert 失败,因为您缺少参数:

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

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

关于c++ - 为什么我不能在 C++0x 中对 std::shared_ptr 的 vector 执行 std::copy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5253169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com