指向void的指针到智能指针

时间:2012-05-05 20:00:17

标签: c++ qt memory-management

我正在尝试使用自定义删除器创建一个void的QScopedPointer来正确管理来自C库的资源(它只向其内部数据结构提供void *)。 但是,当我尝试实例化void的QScopedPointer时,我收到此错误:

/Library/Frameworks/QtCore.framework/Headers/qscopedpointer.h:104:14:
error: cannot form a reference to 'void'
    inline T &operator*() const
(from Clang)

或者这个:

/Library/Frameworks/QtCore.framework/Headers/qscopedpointer.h:104:
error: forming reference to void
(from GCC)

我想专门研究QScopedPointer或用自定义删除器编写基本范围指针,但在这两种情况下,我最终都复制了与QScopedPointer中完全相同的代码。

有什么方法可以摆脱(或专门化)特定的功能,以便编译器不再抱怨了吗?

1 个答案:

答案 0 :(得分:1)

没有。没有办法编写该函数,这样就不会让编译器失去理智。你应该问问自己,无论如何它会有什么意义。一个指向void的智能指针怎么能做一些与void *无关的内容?

void * vptr; *vptr = ??;  ?? = *vptr;  f(*vptr);

这些陈述都没有任何意义。

void *类型是一种非常特殊的类型,用于在C中提供不透明的类型。您可以在C ++中使用它,但通常您不想这样做。我有一种感觉,无论你想做什么,都有更好的方法。

如果你真的需要一个聪明的不透明指针类型,你必须做它,你必须省略解除引用功能。

让我感到惊讶的是,C ++编译器需要不编译未使用的模板的成员函数。这将向我表明您实际上是在尝试取消引用void指针。你不能这样做。如果你想要指针出智能指针,你可以使用get()。我确定QScopedPointer或任何具有类似功能的东西。