1

テンプレート クラスがあります ( NodeBST 内の内部クラスです)。ここで、メモリを解放します。キーまたは値 (またはその両方) のいずれかがポインターである可能性があることを考えると、それらがポインターである場合、それらを解放する方法を理解する必要があります。

例を参照してください。

~Node( void )
{
    if ( is_pointer< TValue >( Value ) )
    {
         delete Value;
         Value = NULL;
    }

    if ( is_pointer< TComparable >( Key ) )
    {
         delete Key;
         Key= NULL;
    }
}

関数の背後にある実装はis_pointer< T >機能しますが (ここから取得)、キーまたは値のいずれかで削除を押すとすぐに、次のようになります。

Error   13  error C2440: 'delete' : cannot convert from 'esc::Shader' to 'void *'   c:\programming\c++\git\escalator\engine\engine\searchtree.hpp   131
Error   14  error C2440: 'delete' : cannot convert from 'esc::ShaderComparable' to 'void *' c:\programming\c++\git\escalator\engine\engine\searchtree.hpp   137
Error   12  error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)   c:\programming\c++\git\escalator\engine\engine\searchtree.hpp   130

static_castdynamic_cast、などを試しましreinterpret_castたが、どちらも機能していないようです。

良い解決策は何ですか?

4

3 に答える 3

4
I must figure out how to free them if they are.

しないでください。本当に-しないでください。これはユーザーの問題です。この動作が必要な場合は、スマート ポインターを提供できます。結局のところ、非所有ポインターをマップしたい場合はどうすればよいでしょうか? または、カスタムのデリータが必要ですか?

ifまた、特殊化を使用しなかったためにデッドコードブランチをとにかくコンパイルするため、コードは機能しません。

于 2012-05-12T02:43:34.857 に答える
2

一般的に行われているように、ポインタの代わりに T 型の要素のコピーを保存しているようです。宣言がT Value;Node クラス以外の場合、通常、Value オブジェクトを削除する責任はありません。

于 2012-05-12T02:39:34.863 に答える