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
为什么会这样?我怎样才能使这项工作?
为什么 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;
...
}
...
};
我在下面的代码中得到 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
为什么会这样?我怎样才能使这项工作?
为什么 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;
...
}
...
};