unique_ptr <Expression> :: Operator'='不可访问

Bra*_*ler 2 c++ std operators unique-ptr c++11

简介:为什么'='赋值运算符不能与两个相同类型的对象一起使用std::unique_ptr<Expression, std::default_delete<Expression>>?请注意,在代码中编写的类型会std::unique_ptr<Expression>在IntelliSense错误中扩展到前者.

信息

IDE - 运行Visual C++ 2010
OS - 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
Run Code Online (Sandbox Code Playgroud)

在网上找到了更好的一个,但它给出了错误,这^没有错误.我所做的就是删除... 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
Run Code Online (Sandbox Code Playgroud)

现在我在这里得到错误,请注意,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
Run Code Online (Sandbox Code Playgroud)

错误如下:

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
Run Code Online (Sandbox Code Playgroud)

现在,我认为这可能与'='的正确大小的'const'有关,但我已经尝试将函数返回类型更改为适合,在返回类型后使用*或&,尝试de-在我将其设置为expr-> lhs之前引用('*')值,甚至尝试过('&')

因此,如果操作员无法访问,我该如何解决?我是否必须自己定义操作员?(废话)嗯,这是完整的代码:PasteBin源代码链接

小智 6

std::unique_ptr是不可转让和不可复制的.如果您想进行此类任务,则需要使用std::move():

lhs = std::move(expr);
Run Code Online (Sandbox Code Playgroud)


Pet*_*ker 5

实例化std::unique_ptr无法复制; 他们只能被移动(因此"独特").因此,对于赋值,您必须说要移动指针:

lhs = std::move(expr);
Run Code Online (Sandbox Code Playgroud)