C++ 嵌套 class 模板错误 C2440“=”:无法从 'type' 转换为 'same type'

C++ Nested class template Error C2440 '=': cannot convert from 'type' to 'same type'

我在下面的代码中得到 2 个(可能)相同的错误:

Error   C2440   'initializing': cannot convert from 'HashTable::HashTableEntry *' to 'HashTable::HashTableEntry *'`
Error C2440 '=': cannot convert from 'HashTable::HashTableEntry *' to 'HashTable::HashTableEntry *'

它出现在我的 HashTable class、rehash() 函数中。下面是代码片段:

template<class T, class V>
class HashTable {
private:
    template<class T, class V> struct HashTableEntry {
        T key;
        V value;
    };
    ...
    int size;
    int capacity;
    HashTableEntry<T,V>* A;
public:
    // ctor
    HashTable(int cap) :
        size(0), capacity(cap), A(new HashTableEntry<T,V>[cap])
    {
        ...
    }
    ...
    template<typename T, typename V> void rehash()
    {
        ...
        HashTableEntry<T,V>* newMemoryRegion = new HashTableEntry<T,V>[capacity];
        HashTableEntry<T,V>* disposable = A; // FIRST ERROR HERE
        A = newMemoryRegion;                 // SECOND ERROR HERE
        ...
    }
    ...
}

我想做的(正如你可能意识到的那样)是让 disposable 指向 A 的内存地址,然后 A 指向 newMemoryRegion的地址。

我试过 static_cast<> 他们 - 没用。然后我取出嵌套的 class - 仍然是同样的错误。最后我尝试了 reinterpret_cast<> 并且第一个错误(初始化)消失了,但是第二个错误仍然存​​在:

HashTableEntry<T,V>* disposable = reinterpret_cast<HashTableEntry<T, V>*>(A); // no more errors here
A = reinterpret_cast<HashTableEntry<T, V>*>(newMemoryRegion); // SAME SECOND ERROR persists here

为什么会这样?我怎样才能使这项工作?

为什么 HashTableEntryrehash() 使用自己的参数进行模板化,这些参数反映了 HashTable 的模板参数?您应该从 HashTableEntryrehash() 中删除模板,让它们继承 HashTable 中的参数:

template<class T, class V>
class HashTable {
private:
    struct HashTableEntry {
        T key;
        V value;
    };
    ...
    int size;
    int capacity;
    HashTableEntry* A;
public:
    // ctor
    HashTable(int cap) :
        size(0), capacity(cap), A(new HashTableEntry[cap])
    {
        ...
    }
    ...
    void rehash()
    {
        ...
        HashTableEntry* newMemoryRegion = new HashTableEntry[capacity];
        HashTableEntry* disposable = A;
        A = newMemoryRegion;
        ...
    }
    ...
};