2016-02-13 66 views
4

。我將舉例說明:我可以繼承模板類並將類型設置爲我目前試圖繼承的類的模板化子類嗎?我知道,可怕的標題是:

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這反過來又KVP的具有一定ValType。

爲了利用我繼承的類,我需要將kvp設置爲類型說明符,但是由於kvp是在哈希表類中聲明的,它不會讓我。有沒有辦法說服它呢?

我可以在哈希表中創建MemMapFileStructured的一個實例,但我認爲這應該是我創建的類的第5個繼承繼承,我不想打破我的目標。

回答

1

您可以使用額外聲明和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這樣的東西真的是其他的一些模板。它總是發生。