首页 > 解决方案 > C++ 嵌套类模板错误 C2440“=”:无法从“类型”转换为“相同类型”

问题描述

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

错误 C2440 '初始化':无法从 'HashTable::HashTableEntry *' 转换为 'HashTable::HashTableEntry *'`
错误 C2440 '=':无法从 'HashTable::HashTableEntry *' 转换为 'HashTable::HashTableEntry *'

它发生在我的HashTable课堂上,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<>他们 - 不好。然后我取出了嵌套类 - 仍然是同样的错误。最后我尝试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

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

标签: c++visual-studiotemplatesinner-classes

解决方案


为什么要使用它们自己的参数HashTableEntry进行rehash()模板化,这些参数反映了 的模板参数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;
        ...
    }
    ...
};

推荐阅读