fork(1) download
  1. #include <map>
  2. #include <string>
  3. #include <memory>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. // Used in the example
  9. struct Resource {};
  10.  
  11. int main(int argc, char** argv) {
  12. // I was able to get the following map running fine
  13. // int -> { string -> unique_ptr }
  14. map<int, map<string, unique_ptr<Resource>>> data;
  15.  
  16. map<string, unique_ptr<Resource>> toBeInserted;
  17. toBeInserted["key"] = unique_ptr<Resource>(new Resource);
  18. // data[1] = toBeInserted; // error
  19. data[1] = std::move(toBeInserted); // ok
  20.  
  21.  
  22. // But the issue happens when it's a vector of unique_ptrs
  23. // int -> { string -> { [unique_ptr] } }
  24. map<int, map<string, vector<unique_ptr<Resource>>>> otherData;
  25.  
  26. vector<unique_ptr<Resource>> list;
  27. list.push_back(unique_ptr<Resource>(new Resource));
  28. list.push_back(unique_ptr<Resource>(new Resource));
  29.  
  30. map<string, vector<unique_ptr<Resource>>> _toBeInserted;
  31. _toBeInserted["key"] = std::move(list); // ok
  32.  
  33. // But I cant insert _toBeInserted back to the original map.
  34. // The compilation errors are all related to the unique_ptr
  35. otherData[1] = std::move(_toBeInserted); // Can't do this
  36. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
In file included from /usr/include/c++/4.9/memory:64:0,
                 from prog.cpp:3:
/usr/include/c++/4.9/bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = std::unique_ptr<Resource>; _Args = {const std::unique_ptr<Resource, std::default_delete<Resource> >&}]':
/usr/include/c++/4.9/bits/stl_uninitialized.h:75:53:   required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::unique_ptr<Resource>*, std::vector<std::unique_ptr<Resource> > >; _ForwardIterator = std::unique_ptr<Resource>*; bool _TrivialValueTypes = false]'
/usr/include/c++/4.9/bits/stl_uninitialized.h:125:41:   required from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::unique_ptr<Resource>*, std::vector<std::unique_ptr<Resource> > >; _ForwardIterator = std::unique_ptr<Resource>*]'
/usr/include/c++/4.9/bits/stl_uninitialized.h:278:63:   required from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::unique_ptr<Resource>*, std::vector<std::unique_ptr<Resource> > >; _ForwardIterator = std::unique_ptr<Resource>*; _Tp = std::unique_ptr<Resource>]'
/usr/include/c++/4.9/bits/stl_vector.h:324:32:   required from 'std::vector<_Tp, _Alloc>::vector(const std::vector<_Tp, _Alloc>&) [with _Tp = std::unique_ptr<Resource>; _Alloc = std::allocator<std::unique_ptr<Resource> >]'
/usr/include/c++/4.9/bits/stl_pair.h:127:17:   required from 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > >; _Args = {std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::unique_ptr<Resource, std::default_delete<Resource> >, std::allocator<std::unique_ptr<Resource, std::default_delete<Resource> > > > >&}; _Tp = std::_Rb_tree_node<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >]'
/usr/include/c++/4.9/bits/alloc_traits.h:253:4:   [ skipping 3 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/c++/4.9/bits/stl_tree.h:1143:66:   required from 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Base_ptr, std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Base_ptr, _Arg&&) [with _Arg = std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > >&; _Key = std::basic_string<char>; _Val = std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > >; _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Base_ptr = std::_Rb_tree_node_base*]'
/usr/include/c++/4.9/bits/stl_tree.h:1603:33:   required from 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique_(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator, _Arg&&) [with _Arg = std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > >&; _Key = std::basic_string<char>; _Val = std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > >; _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >]'
/usr/include/c++/4.9/bits/stl_tree.h:1843:37:   required from 'void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(_II, _II) [with _InputIterator = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >; _Key = std::basic_string<char>; _Val = std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > >; _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >]'
/usr/include/c++/4.9/bits/stl_map.h:706:11:   required from 'void std::map<_Key, _Tp, _Compare, _Alloc>::insert(_InputIterator, _InputIterator) [with _InputIterator = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >; _Key = std::basic_string<char>; _Tp = std::vector<std::unique_ptr<Resource> >; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >]'
/usr/include/c++/4.9/bits/stl_map.h:317:54:   required from 'std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char>; _Tp = std::vector<std::unique_ptr<Resource> >; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::vector<std::unique_ptr<Resource> > > >]'
prog.cpp:35:16:   required from here
/usr/include/c++/4.9/bits/stl_construct.h:75:7: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Resource; _Dp = std::default_delete<Resource>]'
     { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
       ^
In file included from /usr/include/c++/4.9/memory:81:0,
                 from prog.cpp:3:
/usr/include/c++/4.9/bits/unique_ptr.h:356:7: note: declared here
       unique_ptr(const unique_ptr&) = delete;
       ^
stdout
Standard output is empty