我正在尝试创建一个带有自定义删除器的 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 中完全相同的代码。
有什么方法可以去掉(或专门化)那个特定的函数,这样编译器就不会再报错了吗?
最佳答案
没有。没有办法编写该函数,使其不会让编译器大吃一惊。你应该问问自己这有什么意义。一个指向 void 的智能指针怎么能做一些本来就不可能用 void* 做的事情?
void * vptr; *vptr = ??; ?? = *vptr; f(*vptr);
这些陈述根本没有任何意义。
void* 类型是一种非常特殊的类型,旨在提供 C 中的不透明类型。您可以在 C++ 中使用它,但通常您不想这样做。我有一种感觉,无论您想做什么,总有更好的方法。
如果你真的需要一个智能的不透明指针类型,你必须实现它并且你必须省略取消引用功能。
令我感到惊讶的是,C++ 编译器被要求不编译未使用的模板的成员函数。这向我表明您实际上是在尝试取消引用 void 指针。你不能那样做。如果你想让指针脱离智能指针,你可以使用 get()。我确定 QScopedPointer 或任何具有类似功能的东西。
关于c++ - 指向 void 的指针变成智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10465490/