ひどいタイトル、私は知っています。説明します:
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]
コメントを追加