摘要:为什么两个相同类型的对象无法访问'='赋值运算符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' 有关,但我尝试将函数返回类型更改为适合,在返回类型之后使用 * 或 &,尝试 de-在我将其设置为 expr->lhs 之前引用 ('*') 值,甚至尝试过 ('&')
那么,如果操作员无法访问,我该如何解决呢?我必须自己定义运算符吗?(废话)好吧,这里是完整代码:PasteBin Source Code Link