3

我正在尝试使用自定义删除器创建一个 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 中完全相同的代码。

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

4

1 回答 1

1

不。没有办法编写该函数,这样它就不会让编译器大吃一惊。你应该问问自己无论如何它会有什么意义。一个指向 void 的智能指针怎么能做一些 void* 本身不可能做的事情?

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

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

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

如果您真的需要一个智能的不透明指针类型,则必须实现它,并且必须省略取消引用功能。

令我惊讶的是,C++ 编译器被要求不编译不使用的模板的成员函数。这将向我表明您实际上是在尝试取消引用 void 指针。你不能那样做。如果您希望指针脱离智能指针,请使用 get()。我确定 QScopedPointer 或任何具有类似功能的东西。

于 2012-05-06T01:00:14.510 回答