我可以继承一个模板类,并将类型设置为我目前尝试继承的类的模板化子类吗?

时间:2016-02-13 03:22:30

标签: c++ inheritance

可怕的头衔,我知道。我将说明:

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又具有一个具有特定ValType的kvp。

为了利用继承的类I,我需要将kvp设置为类型说明符,但是由于kvp是在哈希表类中声明的,所以它不会让我。有没有办法说服它呢?

我可以在哈希表中创建一个MemMapFileStructured实例,但这将是我构建的类中的第5个连续继承,我不想打破我的滚动。 / p>

1 个答案:

答案 0 :(得分: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这样的东西确实是其他模板。它一直都在发生。