Ошибка "не найдено для оператора =" с g ++ - PullRequest
1 голос
/ 10 марта 2011

У меня есть класс AP

template<typename T>
class AP : public std::auto_ptr<T>
{
    typedef std::auto_ptr<T> Super;
public:
    AP() : Super() { }
    AP(T* t) : Super(t) { }
    AP(AP<T>& o) : Super(o) { }
};

и функция для его возврата.

namespace AIR {
namespace Tests {

namespace
{

    AP<A> CreateGraph()
    {
    AP<A> top(A::Create("xyz").release());
        ...
    return top;
    }

    AP<A> top; 
    top = CreateGraph();

Когда я компилирую код

AP<A> top; 
top = CreateGraph();

Я получил это сообщение об ошибке

no match for ‘operator=’ in ‘top = AIR::Tests::<unnamed>::CreateGraph()()’

Я добавил этот оператор в класс AP, но он не 'т работа.

AP<T>& operator=(AP<T>& o) { (*(Super*)this) = o; return *this; }

Что не так с классом?

РЕДАКТИРОВАТЬ

top.reset(CreateGraph().release()) решил эту проблему.

Ответы [ 3 ]

4 голосов
/ 10 марта 2011

CreateGraph() возвращает значение, поэтому вызов функции CreateGraph() является значением.

Поскольку оператор присваивания std::auto_ptr принимает свой аргумент по неконстантной ссылке, неявно объявленный оператор присваивания AP копирует свой аргумент по неконстантной ссылке.

Ссылка const может быть привязана только к l-значению, отсюда и ошибка.

Как я объяснил в ответ на один из ваших предыдущих вопросов , если вы хотите иметь std::auto_ptr -подобное копирование (где фактический конструктор копирования получает свой аргумент по неконстантной ссылке), вам также нужно реализовать что-то похожее на std::auto_ptr_ref.

Я объясняю, как std::auto_ptr использует этот вспомогательный класс, чтобы разрешить копирование значений r в принятом ответе на Как можно реализовать конструктор копирования std::auto_ptr?

0 голосов
/ 10 марта 2011

Что делать, если вы замените

AP<A> top; 
top = CreateGraph();

на

AP<A> top(CreateGraph());
0 голосов
/ 10 марта 2011

Разве это не должно быть?

AP<T>& operator=(const AP<T>& o)
...