Описание: почему оператор присваивания ‘=’ недоступен для двух объектов одного типа std::unique_ptr<Expression, std::default_delete<Expression>>
?
Имейте в виду, в коде написаны типы std::unique_ptr<Expression>
но расширить до первого в ошибке IntelliSense.
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
Заранее спасибо всем, кто предлагает свою помощь! 🙂
std::unique_ptr
не присваивается и не копируется. Если вы хотите сделать такое назначение, вам нужно будет использовать std::move()
:
lhs = std::move(expr);
Учреждения std::unique_ptr
не может быть скопировано; они могут быть перемещены только (следовательно, «уникальные»). Итак, для назначения вы должны сказать, что хотите переместить указатель:
lhs = std::move(expr);
Проблема в том, что unique_ptr, как следует из названия, поддерживает уникальный указатель. Это одна из основных причин, по которой autp_ptr устарела: он фактически «перемещал» указатель в назначении, а не копировал его. Это считается плохой вещью; если вы делаете «a = b», то вы ожидаете иметь два достаточно идентичных объекта «a» и «b». Вы не ожидаете, что «b» будет опустошен.
Таким образом, чтобы сохранить уникальность указателя, unique_ptr не позволяет копировать в любой форме.