我试图使用NuiCreateSensorByIndex(int, inuissensor **)函数。我尽量不使用裸指针,所以我做了std::unique_ptr<INuiSensor> nui;
使它成为一个unique_ptr。现在我想访问这个函数,所以我做以下操作:hr = NuiCreateSensorByIndex(i, &nui.get());
,但这是错误的:
KinectManager.cpp:29: error: C2102: '&' requires l-value
我做错了什么,如何解决它?
编译器是正确的:虽然std::unique_ptr<INuiSensor>
可以用来指向东西,但它不是NuiCreateSensorByIndex(int,INuiSensor**)
函数所期望的指针对象。函数想要一个指向指针的指针的原因是,它想通过这样的赋值来修改指针的内容:
*ptrToPtr = somePtr;
如果编译器允许您传递指向std::unique_ptr<INuiSensor>
的指针,则此赋值将无效。这就是为什么您需要创建一个临时的"裸"指针,将其传递给函数,然后将结果赋值给std::unique_ptr<INuiSensor>
。
T* get() const;
get
通过值返回其指针,因此您所做的是获取临时(技术上称为右值)的地址,这是不允许的。
INuiSensor* ptr = uni.get();
hr = NuiCreateSensorByIndex(i, &ptr);
unique_ptr的目的是控制资源的所有权。指针指向指针是修改资源的地址,这将改变资源的所有权。一种解决方案是先释放所有权,然后回收它,例如:
auto p = uni.release();
NuiCreateSensorByIndex(0, &p);
uni.reset(p);