<Expression>unique_ptr::无法访问操作员'='
unique_ptr<Expression>::Operator '=' is inaccessible
摘要:为什么'='赋值运算符对于两个类型相同的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
请注意,这里是我得到错误的地方,ParseAddiveExpression()的返回类型是
// 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 FilesMicrosoft Visual Studio 10.0VCincludememory")
is inaccessible
c:userss_miller47documentsvisual studio 2010projects_vc++powercalcmathparser.h 133
现在,我认为这可能与"="大小合适的"const"有关,但我已经尝试将函数返回类型更改为合适的,使用*或&在返回类型之后,在我将其设置为expr->lhs之前,尝试取消引用('*')该值,甚至尝试('&')
那么,如果操作员无法访问,我该如何修复?我必须自己定义操作员吗?(胡说八道)好吧,这是完整的代码:PasteBin源代码链接
std::unique_ptr
是不可分配的,也是不可复制的。如果你想进行这样的分配,你需要使用std::move()
:
lhs = std::move(expr);
不能复制std::unique_ptr
的实例化;它们只能移动(因此是"唯一的")。所以,对于分配,你必须说你想移动指针:
lhs = std::move(expr);
问题在于,顾名思义,unique_ptr维护了一个唯一的指针。这就是autptr被弃用的主要原因之一:它实际上"移动"了赋值中的指针,而不是复制它。这被认为是一件坏事;如果你做"a=b",那么你期望有两个相当相同的对象"a"answers"b"。你不希望"b"被清空。
因此,为了保持指针的唯一性,unique_ptr不允许任何形式的复制。
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 为什么"delete"操作员给我访问权限冲突
- 从私人矢量中公开访问和分配操作员
- 为什么继承的受保护操作员=()有公共访问权限
- 操作员问题 - 访问冲突
- 为什么我超负荷的铸造操作员无法访问私人成员
- 静态指针指向会员数组的安全操作员[]访问
- 我可以分配成员访问操作员的返回值吗?
- NSMutabledictionary和STD :: Map的访问操作员之间的差异
- 通过操作员[]和.at()访问向量的负索引
- 带有超载操作员 的无访问地址的指针返回
- <Expression>unique_ptr::无法访问操作员'='
- 模板类的模板操作员需要访问其他专业
- ostream << 具有模板类的操作员,无法访问私有成员
- 错误 CS0120:访问非静态成员"相机操作员.反转鼠标Y(浮点)"需要对象引用
- 成员不可访问.过载+操作员