2012-05-05 113 views
3

我想创建一个QScopedPointer的void与自定义删除器来正确管理来自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中完全相同的代码。

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

+0

我会写一个自定义scoped-ptr-to-void并将实现委托给QScopedPointer-to-char。 –

+0

创建一个虚拟类型'struct MYDUMMY {}',将'void *'强制转换为'MYDUMMY *',并专注于此。问题将消失。您可能想要为C函数创建内联包装,因此一切都很好。 – Ben

+0

通常你要么知道你正在存储的数据类型(并且可以使用该类型的指针,而不是void),或者不拥有指针(然后范围指针没有识别)。你确定你需要'void *'的范围指针吗? – Lol4t0

回答

1

不可以。编写这个函数是没有办法的,因为它不会让编译器的头脑受挫。你应该问问你自己究竟会有什么感觉。一个无效的指针如何能够做一些与void *无关的事情?

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

这些陈述根本没有任何意义。

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

如果您确实需要一个非常聪明的不透明指针类型,那么您必须创建它,并且您必须省略解除引用功能。

我感到惊讶的是,C++编译器需要不编译未使用的模板的成员函数。这会告诉我你实际上是在试图解引用一个void指针。你不能那样做。如果你想让指针脱离你使用get()的智能指针。我确定QScopedPointer或任何具有类似功能的东西。