我在程序中编写了一个用于处理层次结构路径的路径类。我决定使用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> ]
我不确定我是否理解这些编译错误......其他人都有线索吗?
答案 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