简介:为什么'='赋值运算符不能被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模板参数。我有一组表达式类,如下所示:
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之前,先引用('*')值,甚至尝试使用('&')
因此,如果运算符(operator)无法访问,该如何解决?我必须自己定义运算符(operator)吗? (废话)好吧,这是完整的代码:PasteBin Source Code Link
最佳答案
std::unique_ptr
是不可分配和不可复制的。如果要进行此类分配,则需要使用std::move()
:
lhs = std::move(expr);
关于c++ - unique_ptr <Expression>::Operator '='无法访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12262223/