我正在尝试使用函数NuiCreateSensorByIndex(int,INuiSensor**)。我试图不使用裸指针,所以我做std::unique_ptr<INuiSensor> nui;
使它成为unique_ptr。
现在我想访问此函数,所以我执行以下操作:hr = NuiCreateSensorByIndex(i, &nui.get());
,但这是错误的:
KinectManager.cpp:29: error: C2102: '&' requires l-value
我做错了什么以及如何解决?
答案 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);