Próbuję pozbyć się std :: vector za pomocą boost :: ptr_vector. Teraz próbuję usunąć element z jednego i usunąć usunięty element. Najbardziej oczywiste dla mnie było:Jak usunąć elementy z boost :: ptr_vector
class A
{ int m; };
boost::ptr_vector<A> vec;
A* a = new A;
vec.push_back(a);
vec.erase(a);
Ale to nawet nie będzie się kompilować (zobacz poniżej pełny komunikat o błędzie). Próbowałem wymazać/usunąć idiom jak na std :: vector, ale wszystkie algorytmy boost :: ptr_vector okazały się nieco inne od tych w std :: vector.
więc moje pytania:
- Jak mogę usunąć wskaźnik z punktu A ptr_vector?
- Czy nadal muszę ręcznie usunąć() element, który usunąłem?
błąd kompilatora:
1>------ Build started: Project: ptr_vector_test, Configuration: Debug Win32 ------
1>Compiling...
1>ptr_vector_test.cpp
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2825: 'C': must be a class or namespace when followed by '::'
1> c:\users\rvanhout\svn\trunk\thirdparty\boost\mpl\eval_if.hpp(63) : see reference to class template instantiation 'boost::range_const_iterator<C>' being compiled
1> with
1> [
1> C=A *
1> ]
1> c:\users\rvanhout\svn\trunk\thirdparty\boost\range\iterator.hpp(63) : see reference to class template instantiation 'boost::mpl::eval_if_c<C,F1,F2>' being compiled
1> with
1> [
1> C=true,
1> F1=boost::range_const_iterator<A *>,
1> F2=boost::range_mutable_iterator<A *const >
1> ]
1> c:\users\rvanhout\svn\trunk\thirdparty\boost\ptr_container\detail\reversible_ptr_container.hpp(506) : see reference to class template instantiation 'boost::range_iterator<C>' being compiled
1> with
1> [
1> C=A *const
1> ]
1> c:\tmp\ptr_vector_test\ptr_vector_test.cpp(21) : see reference to function template instantiation 'boost::void_ptr_iterator<VoidIter,T> boost::ptr_container_detail::reversible_ptr_container<Config,CloneAllocator>::erase<A*>(const Range &)' being compiled
1> with
1> [
1> VoidIter=std::_Vector_iterator<void *,std::allocator<void *>>,
1> T=A,
1> Config=boost::ptr_container_detail::sequence_config<A,std::vector<void *,std::allocator<void *>>>,
1> CloneAllocator=boost::heap_clone_allocator,
1> Range=A *
1> ]
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2039: 'const_iterator' : is not a member of '`global namespace''
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2146: syntax error : missing ';' before identifier 'type'
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : error C2208: 'boost::type' : no members defined using this type
1>c:\users\rvanhout\svn\trunk\thirdparty\boost\range\const_iterator.hpp(37) : fatal error C1903: unable to recover from previous error(s); stopping compilation
1>Build log was saved at "file://c:\tmp\ptr_vector_test\Debug\BuildLog.htm"
1>ptr_vector_test - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Myślę, że masz rację co do mojej odpowiedzi poniżej. jeśli rozumiem to poprawnie, domyślny alokator (heap_clone_allocator) klonuje same obiekty podczas ponownego przydzielania). działałoby to przy użyciu view_clone_allocator. Usunąłem moją odpowiedź i przegłosowałem ciebie. dobrze się bawić :) –
Dziękuję, mój problem polegał na tym, że nie zdefiniowałem operatora == dla A * const i który wydaje się konieczny. Aby uzyskać przykład do kompilacji (VC9), musiałem zmienić "A const & rhs" na "A * const & rhs" i odpowiednio zmienić zawartość ciała. To sprawia, że jest trudny w użyciu z klasami bibliotek. – Roel
Brakuje punktu! Element ptr_vector <> przechowuje obiekt tak, jakby był obiektem. Zamiast perwersji operator równości po prostu odrzuć wskaźnik. Jeśli chcesz znaleźć dokładny wskaźnik, musisz użyć find_if i przekazać predykat. –