C++ 独特的_ptr<;表达式>;::操作员'=';无法访问

C++ 独特的_ptr<;表达式>;::操作员'=';无法访问,c++,c++11,operators,std,unique-ptr,C++,C++11,Operators,Std,Unique Ptr,摘要:为什么对于同一类型的两个对象,'='赋值运算符不可访问std::unique_ptr? 请注意,在代码中,类型被写入std::unique_ptr,但在IntelliSense错误中扩展为前者 信息 ID-运行Visual C++ 2010 BR> 操作系统-Windows Vista 目标控制台应用程序试图使用C++11的实现 一些背景 我已经提供了C++中表达式求值器的一个例子,它显然符合新标准,因为应该是实数代码给我错误,我猜是因为VC++对该特性没有支持。我遇到的第一个错误是“m

摘要:为什么对于同一类型的两个对象,'='赋值运算符不可访问
std::unique_ptr
? 请注意,在代码中,类型被写入
std::unique_ptr
,但在IntelliSense错误中扩展为前者

信息

ID-运行Visual C++ 2010 BR> 操作系统-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
模板
std::unique_ptr make_unique()
{
返回std::unique_ptr(new T());
}//基本上只是包装“新”?不知道为什么
在网上找到了一个更好的,但有错误,此^0没有错误。我所做的只是删除了…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
类表达式{
虚~Expression(){}
};
类BinaryExpression:公共表达式{
公众:
std::唯一的ptr lhs;
std::唯一的ptr rhs;
虚拟字符GetType()常量=0;//+,-,/,*
};
//然后是多重表情,多重表情,多重表情,等等
注意,这里是我得到错误的地方,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
//expr、lhs和rhs都是同一类型
标准::唯一性\u ptr:
auto rhs=ParseAdditiveExpression();
auto expr=make_unique();//尝试使用:std::unique_ptr expr;
expr->lhs=lhs;//麻烦制造者
expr->rhs=rhs;//全部生产
lhs=expr;//同样的错误
错误如下:

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
1 IntelliSense:“std::unique\u ptr&std::unique\u ptr::operator=(const std::unique\u ptr&)[带Ty=Expression,Dx=std::default\u delete]”
(在“C:\Program Files\Microsoft Visual Studio 10.0\VC\include\memory”的第2352行声明)
无法访问
c:\users\s\u miller47\documents\visual studio 2010\projects\u vc++\powercalc\mathparser.h 133
现在,我认为这可能与大小合适的“=”的“const”有关,但我尝试过将函数返回类型更改为适合,在返回类型之后使用*或(&R),尝试在将值设置为expr->lhs之前取消引用(“*”),甚至尝试(“&”)


因此,如果操作员无法访问,我如何修复它?我必须自己定义操作符吗?(胡说八道)好吧,这是完整的代码:

std::unique\u ptr
是不可分配和不可复制的。如果要进行此类分配,则需要使用
std::move()


问题在于,顾名思义,unique_ptr维护着一个唯一的指针。这是不推荐使用autp_ptr的主要原因之一:它实际上在赋值中“移动”了指针,而不是复制它。这被认为是一件坏事;如果你做了“a=b”,那么你期望有两个相当相同的对象“a”和“b”。你不希望“b”被清空


因此,为了保持指针的唯一性,unique_ptr不允许任何形式的复制。

无法复制
std::unique_ptr
的实例化;它们只能移动(因此称为“唯一”)。因此,对于赋值,您必须说您想要移动指针:

lhs = std::move(expr);

unique\u ptr
不可复制。尝试
expr->lhs=std::move(lhs)“不确定原因”:.@R.MartinhoFernandes是的,考虑到“独特”的facepalm,这似乎很明显。哈哈,我觉得这个问题很复杂或是什么的,所以给了大家这些信息,谢谢你们的帮助。哇,忘了把一件事放在一个机构里,然后被否决。呵呵,哦,好吧:p我想我的文章的其余部分格式很好,lol可以给我一个荣誉,因为我不只是说“呃,嘿,我有操作员无法访问的错误,该怎么办啊!!???”而投了更高的票来补偿。这是一个问得很好、很有意义的问题,如果有人也有同样的问题,他可能会去搜索。答案简单这一事实并不能使问题无效。如此简单的解决方案并不是一个简单的问题。谢谢!:)“是不可转让和不可复制的”这是移动可转让的。是的,哈哈,我想我在试图复制它的时候,并没有很好地考虑“独特”到硬。
lhs = std::move(expr);