Конструктор копирования недоступен или конструктор копирования объявлен как «явный» - PullRequest
5 голосов
/ 06 августа 2010

Может кто-нибудь объяснить, почему я получаю здесь ошибку компиляции - ошибка C2558: класс 'std :: auto_ptr <_Ty>': конструктор копирования недоступен или конструктор копирования объявлен как "явный"

#include <memory>
#include <vector>
#include <string>
template<typename T>
struct test
{
    typedef std::auto_ptr<T> dataptr;
    typedef std::auto_ptr< test<T> > testptr;
    test( const T& data ):
    data_( new T(data) )
    {
    };
    void add_other( const T& other )
    {
        others_.push_back( testptr( new test(other) ) );
    }
private:
    dataptr data_;
    std::vector< testptr > others_;
};

int main(int argc, char* argv[])
{
    test<std::string> g("d");

    //this is the line that causes the error.
    g.add_other("d");

    return 0;
}

Ответы [ 4 ]

6 голосов
/ 06 августа 2010

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

others_.push_back( testptr( new test(other) ) );

Требуется, чтобы существовал конструктор копирования, который принимает const&, и не существует такого конструктора для std::auto_ptr. Это широко рассматривается как хорошая вещь , поскольку вы никогда не должны использовать std::auto_ptr в контейнере! Если вы не понимаете, почему это так, тогда прочитайте эту статью Хербом Саттер , в частности, раздел, озаглавленный «Чего не следует делать и почему не следует делать» примерно на 3/4 пути.

6 голосов
/ 06 августа 2010
    others_.push_back( testptr( new test(other) ) );

Вы пытаетесь вставить auto_ptr в std::vector

auto_ptr не не определяет неявный конструктор копирования и не совместим как значение вклассы контейнеров stl.

См. этот вопрос для получения дополнительной информации: StackOverflow: почему неправильно использовать stdauto ptr с контейнерами stl

4 голосов
/ 06 августа 2010

Вы не можете создать стандартные контейнеры библиотеки auto_ptr, как вы пытаетесь сделать здесь:

std::vector< testptr > others_;

, поскольку они не имеют правильной семантики.Вам придется использовать обычные указатели или другой вид интеллектуального указателя, например shared_ptr.

2 голосов
/ 06 августа 2010

Возможно, вы хотите использовать std :: unique_ptr или std :: shared_ptr из будущего стандарта C ++ 0x, который заменит auto_ptr, если у вас есть доступ к компилятору, который их реализовал (gcc 4.5 +)

http://www2.research.att.com/~bs/C++0xFAQ.html#std-unique_ptr http://www2.research.att.com/~bs/C++0xFAQ.html#std-shared_ptr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...