可怕的标题,我知道。我来举例说明:

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 仍将是您期望的样子。这可能是我们的小 secret ,它真的是别的东西。

事实上,如果你仔细研究你的 C++ 编译器的库,你可能会发现诸如,哦,说 std::vector<TYPENAME>::iterator 真的是其他一些模板。它一直在发生。

10-08 04:36