コンパイル時には、概念的には私のために、リファクタリングの提案は歓迎されているので、このコンパイル方法は次のとおりです。プライベートデストラクタでテンプレートエラーをバイパスする
"検索"デストラクタがプライベートなのでコンパイルエラーが発生しましたが、ベースクラスの初期化でカスタムDeleterを提供して以来、私は検索ポインタでdeleteを使用しません。私は、コンパイラがそれを迂回する方法を知らないことを知っています。
エラーの説明: エラーC2248:プライベートメンバにアクセスすることはできません コンパイラが生成した「検索」クラスで宣言された「検索::〜検索」ここ
class Search
{
public:
static Search* New(/* */); // using a pool of already allocated objects to avoid expensive allocations
static void Delete(Search*);
private:
Search(/* */) {/* */}
~Search() {/* */}
};
template<class T>
class MyList
{
public:
typedef (*CustomDeleter) (T* pElement);
MyList(CustomDeleter lpfnDeleter = NULL) {};
void Empty()
{
for (/**/)
{
if (m_pList[m_nListLastUsed])
{
if (m_lpfnCustomDeleter == NULL)
delete m_pList[m_nListLastUsed]; // COMPILE ERROR HERE BECAUSE Search destructor is private BUT I won't use that instruction since
// I provided a custom Deletern I know that the compiler doesn't know that, how to bypass it
else
m_lpfnCustomDeleter(m_pList[m_nListLastUsed]);
}
}
}
private:
T** m_pList;
CustomDeleter m_lpfnCustomDeleter; // Pointer to a custom deleter
};
class Query : public MyList<Search>
{
public:
Query() : MyList<Search>(&Search::Delete) // I set a custom deleter since Search hides its destructor : is this the right way ?
{}
~Query()
{
/****/
Empty(); // PROBLEM HERE
/***/
}
};
@Holt検索オブジェクトを削除したくないため、後で使用するために、検索対象をロックフリースタック(保存した後)に保存したい場合は、 – Aminos
とお考えください* call *コードは無効な*コードが存在することを意味するものではありません。 'delete m_pList [m_nListLastUsed]; 'あなたが提供していない適切にアクセス可能なデストラクタを期待しています。したがって、コードは有効ではないため、エラーになります。私はそれが可能なsfinaeの選択肢を持っているかどうかを検討するために一瞬それをゲルにしなければならないでしょう。 – WhozCraig
'm_pList'はどこにも定義されていません。投稿してください[MCVE](http://stackoverflow.com/help/mcve) –