3

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

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

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

4

3 回答 3

6

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

*ptrToPtr = somePtr;

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

于 2013-04-28T12:29:07.133 回答
0
T* get() const;

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

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

INuiSensor* ptr = uni.get();

hr = NuiCreateSensorByIndex(i, &ptr);
于 2013-04-28T12:30:50.937 回答
0

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

auto p = uni.release();
NuiCreateSensorByIndex(0, &p);
uni.reset(p);
于 2018-04-16T16:44:33.020 回答