2012-05-05 14 views
3

void(void *を内部データ構造体にのみ提供する)Cライブラリからの適切に管理されたリソースに対して、カスタムdeleterでvoidのQScopedPointerを作成しようとしています。私は、ボイドのQScopedPointerをインスタンス化しようとすると、 はしかし、私はこのエラーを取得する:スマートポインタへのvoidへのポインター

/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 *で本質的に不可能な何かをどうやって行うことができますか?

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

これらのステートメントはまったく意味がありません。

void *型は、Cで不透明な型指定を提供するための非常に特殊な型です。C++で使用できますが、通常は使用したくありません。あなたがしようとしていることがあれば、よりよい方法があるという気持ちがあります。

実際には、スマートな不透明なポインタ型が必要な場合は、それを作成しなければならず、逆参照機能は必要ありません。

私は、C++コンパイラが使用されていないテンプレートのメンバ関数をコンパイルしないように要求されているのは驚きです。これは、あなたが実際にvoidポインタを逆参照しようとしていることを私に示します。あなたはそれをすることはできません。ポインタをスマートポインタから外したい場合はget()を使います。私はQScopedPointerか何か類似の機能を持っていると確信しています。

関連する問題