我在下面的代码上得到了2个(可能(相同的错误:
错误C2440"initializing":无法从"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
为什么会发生这种情况?我怎样才能做到这一点?
为什么HashTableEntry
和rehash()
使用自己的参数模板化,这些参数与HashTable
的模板参数镜像?您应该从HashTableEntry
和rehash()
中删除模板,并让它们继承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;
...
}
...
};