Я написал класс путей в моей программе для обработки иерархических структур путей.Я решил использовать std :: shared_ptr в качестве стандартного возвращаемого типа для всего класса, так как мне это очень нравится.
Что меня удивило, так это то, что я не смог использовать std :: copy или обычный вектор.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> C: \ Program Files (x86) \ Microsoft Visual Studio 10.0\ VC \ include \ iterator (21): ошибка C2039: 'const_reference': не является членом 'std :: tr1 :: shared_ptr <_Ty>' 1> с 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> ]
Я не уверен, что понимаю любую из этих ошибок компилятора ... У кого-нибудь еще есть подсказка?