'&安培;'要求& std :: unique_ptr<> .get上的l值

时间:2013-04-28 12:23:28

标签: c++ unique-ptr lvalue

我正在尝试使用函数NuiCreateSensorByIndex(int,INuiSensor**)。我试图不使用裸指针,所以我做std::unique_ptr<INuiSensor> nui;使它成为unique_ptr。 现在我想访问此函数,所以我执行以下操作:hr = NuiCreateSensorByIndex(i, &nui.get());,但这是错误的:

KinectManager.cpp:29: error: C2102: '&' requires l-value

我做错了什么以及如何解决?

3 个答案:

答案 0 :(得分:5)

编译器是正确的:虽然std::unique_ptr<INuiSensor>可用于指向事物,但它不是指向NuiCreateSensorByIndex(int,INuiSensor**)函数所期望的指针的对象。函数想要指向指针的原因是它想要通过这种赋值来修改指针的内容:

*ptrToPtr = somePtr;

如果编译器允许您将指针传递给std::unique_ptr<INuiSensor>,则此分配将无效。这就是为什么你需要创建一个临时的“裸”指针,将它传递给函数,然后将结果分配回std::unique_ptr<INuiSensor>

答案 1 :(得分:0)

T* get() const;

get通过 value 返回其指针,因此您所做的是获取临时(技术上称为右值)的地址,这是不允许的。

要解决此问题,您应该将该值存储在变量中:

INuiSensor* ptr = uni.get();

hr = NuiCreateSensorByIndex(i, &ptr);

答案 2 :(得分:0)

unique_ptr的目的是控制资源的所有权。指向指针的指针是修改资源的地址,这将改变资源的所有权。一种解决方案是首先释放所有权,然后回收它,例如:

auto p = uni.release();
NuiCreateSensorByIndex(0, &p);
uni.reset(p);