unique_ptr & lt; Выражение & gt; :: Operator ‘=’ недоступно

Описание: почему оператор присваивания ‘=’ недоступен для двух объектов одного типа std::unique_ptr<Expression, std::default_delete<Expression>>?
Имейте в виду, в коде написаны типы std::unique_ptr<Expression> но расширить до первого в ошибке IntelliSense.

[Информация] IDE — Запуск Visual C ++ 2010
ОС — Windows Vista
Цель — консольное приложение, пытающееся использовать то, что реализовано в C ++ 11

[Немного предыстории] Мне предоставили пример оценщика выражений в C ++, который, очевидно, соответствует новому стандарту, потому что то, что должно быть твердым кодом, дает мне ошибки, и я предполагаю, что это потому, что VC ++ не поддерживает эту функцию. Первая ошибка, которую я получил, была связана с методом make_unique, VC ++ сказал, что «идентификатор не существует», поэтому я реализовал его сам

template<typename T>
std::unique_ptr<T> make_unique()
{
return std::unique_ptr<T>(new T());
} // Basically just wrapping 'new'? Not sure why

Нашел лучший онлайн, но он дал ошибки, этот ^ не дает ошибок. Все, что я сделал, это удалил параметр шаблона … Args. У меня есть набор классов Expression, который выглядит следующим образом:

class Expression {
virtual ~Expression() {}
};

class BinaryExpression : public Expression {
public:
std::unique_ptr<Expression> lhs;
std::unique_ptr<Expression> rhs;
virtual char GetType() const = 0; // +,-,/,*
};
// Then MulExpression, DivExpression, PlusExpression, blah blah

Теперь вот где я получаю сообщение об ошибке, обратите внимание, тип возвращаемого значения ParseAdditiveExpression ()

// expr, lhs, and rhs are all of the same type
std::unique_ptr<Expression>:
auto rhs = ParseAdditiveExpression();
auto expr = make_unique<MulExpression>(); // Tried using: std::unique_ptr<Expression> expr;
expr->lhs = lhs; // Trouble Makers
expr->rhs = rhs; // All produce
lhs = expr; // The same errors

Ошибка заключается в следующем:

1   IntelliSense: "std::unique_ptr<_Ty, _Dx> &std::unique_ptr<_Ty, _Dx>::operator=(const std::unique_ptr<_Ty, _Dx> &) [with _Ty=Expression, _Dx=std::default_delete<Expression>]"(declared at line 2352 of "C:\Program Files\Microsoft Visual Studio 10.0\VC\include\memory")
is inaccessible
c:\users\s_miller47\documents\visual studio 2010\projects\_vc++\powercalc\mathparser.h  133

Теперь я думаю, что это может иметь какое-то отношение к ‘const’ в правильном размере ‘=’, но я попытался изменить тип возвращаемого функции, чтобы он соответствовал * или & после возвращаемого типа попытался разыменовать (‘*’) значение, прежде чем я установил его в expr-> lhs, даже попытался (‘&«)

Так что, если оператор недоступен, как я могу это исправить? Нужно ли самому определять оператора? (нонсенс) Ну, вот полный код, может быть, кто-нибудь может дать мне ответ на этот длинный и длинный вопрос. Ссылка на исходный код PasteBin

Заранее спасибо всем, кто предлагает свою помощь! 🙂

2

Решение

std::unique_ptr не присваивается и не копируется. Если вы хотите сделать такое назначение, вам нужно будет использовать std::move():

lhs = std::move(expr);
6

Другие решения

Учреждения std::unique_ptr не может быть скопировано; они могут быть перемещены только (следовательно, «уникальные»). Итак, для назначения вы должны сказать, что хотите переместить указатель:

lhs = std::move(expr);
4

Проблема в том, что unique_ptr, как следует из названия, поддерживает уникальный указатель. Это одна из основных причин, по которой autp_ptr устарела: он фактически «перемещал» указатель в назначении, а не копировал его. Это считается плохой вещью; если вы делаете «a = b», то вы ожидаете иметь два достаточно идентичных объекта «a» и «b». Вы не ожидаете, что «b» будет опустошен.

Таким образом, чтобы сохранить уникальность указателя, unique_ptr не позволяет копировать в любой форме.

3
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector