I've got the following batch of code:
std::vector<std::unique_ptr<AVLTree_GeeksforGeeks>> AVLArray(100000); /* Let's add some objects in the vector */ AVLTree_GeeksforGeeks *avl = new AVLTree_GeeksforGeeks(); avl->Insert[2]; avl->Insert[5]; AVL->Insert[0]; unique_ptr<AVLTree_GeeksforGeeks> unique_p(avl); AVLArray[0] = move(unique_p); /* we do this for a number of other trees, let's say another 9... ... ... Now the vector has objects up until AVLTree[9] */ /* Let's try iterating through its valid, filled positions */ for(auto i : AVLTree ) { cout << "Hey there!\n"; //This loop should print 10 "Hey there"s. }
Ruh roh. Compilation error at the last part, in the for() loop.
\DataStructures2013_2014\main.cpp||In function 'int main()':| \DataStructures2013_2014\main.cpp|158|error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = AVLTree_GeeksforGeeks; _Dp = std::default_delete<AVLTree_GeeksforGeeks>; std::unique_ptr<_Tp, _Dp> = std::unique_ptr<AVLTree_GeeksforGeeks>]'| e:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\unique_ptr.h|256|error: declared here| ||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===|
Any ideas on what I am doing wrong?
The loop
for (auto i: AVLTree) { ... }
tries to make a copy of each element of the range in AVLTree.begin()
and AVLTree.end()
. Of course, std::unique_ptr<T>
can't be copied: there is only one std::unique_ptr<T>
to each pointer. It wouldn't really copy anything but rather steal it. That would be bad.
You want to use references instead:
for (auto& i: AVLTree) { ... }
... or, if you don't modify them
for (auto const& i: AVLTree) { ... }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With