テンプレートクラスを継承し、現在継承しようとしているクラスのテンプレート化されたサブクラスにタイプを設定できますか?

user81993

ひどいタイトル、私は知っています。説明します:

template <typename ValType> struct MemMapFileHashTable : MemMapFileStructured<MemMapFileHashTable<ValType>::kvp> {
    struct kvp {
        uint32_t key;
        ValType val;
    };

    MemMapFileHashTable(const char* fileName, bool write = false, int64_t chunkB = 65536) : MemMapFileStructured(fileName, write, chunkB) { }
};

つまり、特定のValTypeを使用してハッシュテーブルを作成し、特定のValTypeを使用してkvpを作成するという考え方です。

継承しているクラスを利用するには、型指定子としてkvpを設定する必要がありますが、kvpはハッシュテーブルクラス内で宣言されているため、許可されません。そうでなければそれを説得する方法はありますか?

ハッシュテーブル内にMemMapFileStructuredのインスタンスを作成することもできますが、これは私が作成したクラスの行で5回連続の継承であり、ロールを壊したくありません。

サム・バルシャフチク

追加の宣言とを使用して、同等の結果を得ることができtypedefます。例:

template<typename ValType> struct kvp_t {
    uint32_t key;
    ValType val;
};

template <typename ValType> struct MemMapFileHashTable : MemMapFileStructured<kvp_t<ValType>> {

    typedef kvp_t<ValType> kvp;

    MemMapFileHashTable(const char* fileName, bool write = false, int64_t chunkB = 65536) : MemMapFileStructured(fileName, write, chunkB) { }
};

kvpメインテンプレートのタイプを引き続き使用したい場合は、私のゲストになってください。誰も違いを見分けることができません。MemMapFileHashTable<ValType>::kvpそれでもあなたが期待するものになります。それは私たちの小さな秘密かもしれません、それは本当に何か他のものです。

実際、C ++コンパイラのライブラリをざっと見てみると、たとえばstd::vector<TYPENAME>::iterator、他のテンプレートであることがわかるでしょうそれはいつも起こります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ