Проблемы компиляции с вектором <auto_ptr <>>

Рассмотрите следующий код:

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

struct A
{
    int a;
    A(int a_):a(a_) {}
};

int main()
{
    vector<auto_ptr<A> > as;
    for (int i = 0; i < 10; i++)
    {
        auto_ptr<A> a(new A(i));
        as.push_back(a);
    }
    for (vector<auto_ptr<A> >::iterator it = as.begin(); it != as.end(); ++it)
        cout << (*it)->a << endl;
}

При попытке скомпилировать его, я получаю следующую неясную ошибку компилятора от g ++:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/proba.d" -MT"src/proba.d" -o"src/proba.o" "../src/proba.cpp"
/usr/include/c++/4.1.2/ext/new_allocator.h: In member function ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = std::auto_ptr<A>]’:
/usr/include/c++/4.1.2/bits/stl_vector.h:606:   instantiated from ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::auto_ptr<A>, _Alloc = std::allocator<std::auto_ptr<A> >]’
../src/proba.cpp:19:   instantiated from here
/usr/include/c++/4.1.2/ext/new_allocator.h:104: error: passing ‘const std::auto_ptr<A>’ as ‘this’ argument of ‘std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 = A, _Tp = A]’ discards qualifiers
/usr/include/c++/4.1.2/bits/vector.tcc: In member function ‘void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = std::auto_ptr<A>, _Alloc = std::allocator<std::auto_ptr<A> >]’:
/usr/include/c++/4.1.2/bits/stl_vector.h:610:   instantiated from ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::auto_ptr<A>, _Alloc = std::allocator<std::auto_ptr<A> >]’
../src/proba.cpp:19:   instantiated from here
/usr/include/c++/4.1.2/bits/vector.tcc:256: error: passing ‘const std::auto_ptr<A>’ as ‘this’ argument of ‘std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 = A, _Tp = A]’ discards qualifiers
/usr/include/c++/4.1.2/bits/stl_construct.h: In function ‘void std::_Construct(_T1*, const _T2&) [with _T1 = std::auto_ptr<A>, _T2 = std::auto_ptr<A>]’:
/usr/include/c++/4.1.2/bits/stl_uninitialized.h:86:   instantiated from ‘_ForwardIterator std::__uninitialized_copy_aux(_InputIterator, _InputIterator, _ForwardIterator, __false_type) [with _InputIterator = __gnu_cxx::__normal_iterator<std::auto_ptr<A>*, std::vector<std::auto_ptr<A>, std::allocator<std::auto_ptr<A> > > >, _ForwardIterator = __gnu_cxx::__normal_iterator<std::auto_ptr<A>*, std::vector<std::auto_ptr<A>, std::allocator<std::auto_ptr<A> > > >]’
/usr/include/c++/4.1.2/bits/stl_uninitialized.h:113:   instantiated from ‘_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<std::auto_ptr<A>*, std::vector<std::auto_ptr<A>, std::allocator<std::auto_ptr<A> > > >, _ForwardIterator = __gnu_cxx::__normal_iterator<std::auto_ptr<A>*, std::vector<std::auto_ptr<A>, std::allocator<std::auto_ptr<A> > > >]’
/usr/include/c++/4.1.2/bits/stl_uninitialized.h:254:   instantiated from ‘_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>) [with _InputIterator = __gnu_cxx::__normal_iterator<std::auto_ptr<A>*, std::vector<std::auto_ptr<A>, std::allocator<std::auto_ptr<A> > > >, _ForwardIterator = __gnu_cxx::__normal_iterator<std::auto_ptr<A>*, std::vector<std::auto_ptr<A>, std::allocator<std::auto_ptr<A> > > >, _Tp = std::auto_ptr<A>]’
/usr/include/c++/4.1.2/bits/vector.tcc:279:   instantiated from ‘void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = std::auto_ptr<A>, _Alloc = std::allocator<std::auto_ptr<A> >]’
/usr/include/c++/4.1.2/bits/stl_vector.h:610:   instantiated from ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::auto_ptr<A>, _Alloc = std::allocator<std::auto_ptr<A> >]’
../src/proba.cpp:19:   instantiated from here
/usr/include/c++/4.1.2/bits/stl_construct.h:81: error: passing ‘const std::auto_ptr<A>’ as ‘this’ argument of ‘std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 = A, _Tp = A]’ discards qualifiers
make: *** [src/proba.o] Error 1

Мне кажется, что существует некоторая проблема с consts здесь. Делает это означает это auto_ptr не может использоваться в vectors?

7
задан Péter Török 15 April 2010 в 08:31
поделиться

2 ответа

Верно, std :: auto_ptr не может использоваться в std :: vector .

Компилятор жалуется на то, что оператор присваивания для auto_ptr изменяет присваиваемый объект, поэтому он не может быть const .

Вы хотите использовать либо boost :: ptr_vector , либо вектор boost :: shared_ptr s

18
ответ дан 6 December 2019 в 07:50
поделиться

auto_ptr имеет конструктор копирования с неконстантным параметром, поэтому компилятор не может вызвать его из vector :: push_back () , поскольку последний имеет параметр const.

Причина в том, что когда вы инициализируете один экземпляр auto_ptr из другого, новый экземпляр отключает объект от другого экземпляра и подключает его к себе, поэтому избегайте ситуации с зависшим указателем, когда один экземпляр удаляет s объект, а другой по-прежнему содержит указатель на него.

5
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: