2012-05-05 157 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或任何具有類似功能的東西。