我在我的程序中编写了一个用于处理层次结构的路径类.我决定使用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)
我不确定我是否理解这些编译器错误...其他人有线索吗?
你试图对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,第二个参数是要插入的对象.编译器尝试使用它,但无法将迭代器转换为对象类型.
| 归档时间: |
|
| 查看次数: |
2582 次 |
| 最近记录: |