Is there a concise, generic way to convert a std container (such as vector) of regular/dumb pointers:
vector< T* > to, for instance, boost::shared_ptr?:
vector< boost::shared_ptr<T> > I thought I could pull it off using vector's range constructor:
vector< T* > vec_a; ... vector< boost::shared_ptr<T> > vec_b( vec_a.begin(), vec_a.end() ); but that refused to compile (Visual Studio 2008).
EDIT: Test code:
void test() { vector< int* > vec_a; vector< boost::shared_ptr<int> > vec_b( vec_a.begin(), vec_a.end() ); } Compilation errors:
1>c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\memory(131) : error C2664: 'std::allocator<_Ty>::construct' : cannot convert parameter 2 from 'int *' to 'const boost::shared_ptr<T> &' 1> with 1> [ 1> _Ty=boost::shared_ptr<int> 1> ] 1> and 1> [ 1> T=int 1> ] 1> Reason: cannot convert from 'int *' to 'const boost::shared_ptr<T>' 1> with 1> [ 1> T=int 1> ] 1> Constructor for class 'boost::shared_ptr<T>' is declared 'explicit' 1> with 1> [ 1> T=int 1> ] 1> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\memory(822) : see reference to function template instantiation '_FwdIt std::_Uninit_copy<int**,_FwdIt,_Alloc>(_InIt,_InIt,_FwdIt,_Alloc &,std::_Nonscalar_ptr_iterator_tag,std::_Range_checked_iterator_tag)' being compiled 1> with 1> [ 1> _FwdIt=boost::shared_ptr<int> *, 1> _Alloc=std::allocator<boost::shared_ptr<int>>, 1> _InIt=int ** 1> ] 1> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\vector(1141) : see reference to function template instantiation '_FwdIt stdext::unchecked_uninitialized_copy<_Iter,boost::shared_ptr<T>*,std::allocator<_Ty>>(_InIt,_InIt,_FwdIt,_Alloc &)' being compiled 1> with 1> [ 1> _FwdIt=boost::shared_ptr<int> *, 1> _Iter=std::_Vector_iterator<int *,std::allocator<int *>>, 1> T=int, 1> _Ty=boost::shared_ptr<int>, 1> _InIt=std::_Vector_iterator<int *,std::allocator<int *>>, 1> _Alloc=std::allocator<boost::shared_ptr<int>> 1> ] 1> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\vector(956) : see reference to function template instantiation 'boost::shared_ptr<T> *std::vector<_Ty>::_Ucopy<_Iter>(_Iter,_Iter,boost::shared_ptr<T> *)' being compiled 1> with 1> [ 1> T=int, 1> _Ty=boost::shared_ptr<int>, 1> _Iter=std::_Vector_iterator<int *,std::allocator<int *>> 1> ] 1> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\vector(889) : see reference to function template instantiation 'void std::vector<_Ty>::_Insert<_Iter>(std::_Vector_const_iterator<_Ty,_Alloc>,_Iter,_Iter,std::forward_iterator_tag)' being compiled 1> with 1> [ 1> _Ty=boost::shared_ptr<int>, 1> _Iter=std::_Vector_iterator<int *,std::allocator<int *>>, 1> _Alloc=std::allocator<boost::shared_ptr<int>> 1> ] 1> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\vector(537) : see reference to function template instantiation 'void std::vector<_Ty>::insert<_Iter>(std::_Vector_const_iterator<_Ty,_Alloc>,_Iter,_Iter)' being compiled 1> with 1> [ 1> _Ty=boost::shared_ptr<int>, 1> _Iter=std::_Vector_iterator<int *,std::allocator<int *>>, 1> _Alloc=std::allocator<boost::shared_ptr<int>> 1> ] 1> c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\vector(514) : see reference to function template instantiation 'void std::vector<_Ty>::_Construct<_Iter>(_Iter,_Iter,std::input_iterator_tag)' being compiled 1> with 1> [ 1> _Ty=boost::shared_ptr<int>, 1> _Iter=std::_Vector_iterator<int *,std::allocator<int *>> 1> ] 1> .\test.cpp(8364) : see reference to function template instantiation 'std::vector<_Ty>::vector<std::_Vector_iterator<int,_Alloc>>(_Iter,_Iter)' being compiled 1> with 1> [ 1> _Ty=boost::shared_ptr<int>, 1> _Alloc=std::allocator<int *>, 1> _Iter=std::_Vector_iterator<int *,std::allocator<int *>> 1> ]
::std::tr1::shared_ptrif you can. It's nice to avoid dependencies on third party libraries, even ones as spectacular as boost.