我不得不創建一個模板化的哈希表,但是無論何時我試圖編譯它,我都會收到幾個錯誤,說明有未聲明的標識符,並且模板在它們之後不是類型名稱。問題特別在hashTable類中。哈希表模板實現的問題
//Author: Angelo Todaro
//hashTable.h
//File for the implementation of the hash table
#include "person.h"
#include "student.h"
#include "administrator.h"
#include "faculty.h"
#include <list>
using namespace std;
#ifndef hashTable_H
#define hashTable_H
template<class T, typename T2, typename T3>
class hashTable{
public:
/*Default Constructor
*Constructs an object of the hashTable class*/
hashTable();
/*Default Destructor
*Destructs an object of the hashTable class*/
~hashTable();
/*Accessor Method for size of table
*Provides user access to the value of the size of the table*/
T getSize() const;
/*Modifier Method for size of table
*Provides the user access to change the value of the size of the table*/
void setSize(T newSize);
/*getEntry
*Retrieves an entry from the table based on the key*/
T2 getEntry(T3 searchEntry);
/*putEntry
*Puts a new entry in its proper location in the table*/
void putEntry(T2 newEntry);
/*removeEntry
*Removes an entry from its location in the table*/
void removeEntry(T3 searchEntry);
private:
T size;
list<T2> table[size];
list<T2>::iterator iter;
/*hashKey
*Hashes the given key in order to find its location in the table*/
T hashKey(T3 key);
};
#endif
//Implementation section
/*Default Constructor
*Constructs an object of the hashTable class*/
template<typename T, typename T2, typename T3>
hashTable<T,T2,T3>::hashTable(){
}
/*Default Destructor
*Destructs an object of the hashTable class*/
template<typename T, typename T2, typename T3>
hashTable<T,T2,T3>::~hashTable(){
}
/*Accessor Method for size of table
*Provides user access to the value of the size of the table*/
template<typename T, class T2, class T3>
T hashTable<T,T2,T3>::getSize() const{
return size;
}
/*Modifier Method for size of table
*Provides the user access to change the value of the size of the table*/
template<typename T, typename T2, typename T3>
void hashTable<T,T2,T3>::setSize(T newSize){
size = newSize;
}
/*getEntry
*Retrieves an entry from the table based on the key*/
template<typename T, typename T2, typename T3>
T2 hashTable<T,T2,T3>::getEntry(T3 searchEntry){
int key = hashKey(searchEntry);
if(table[key]==NULL)
{
return -1;
}
else
{
while(iter != table[key].end() || searchEntry != *iter->getKey())
iter++;
if(iter == table[key].end() && searchEntry != *iter->getKey())
{
return -1;
}
else
{
*iter->print();
}
}
}
/*putEntry
*Puts a new entry in its proper location in the table*/
template<typename T, typename T2, typename T3>
void hashTable<T,T2,T3>::putEntry(T2 newEntry){
int key = hashKey(newEntry->getKey());
table[key].push_back(newEntry);
}
/*removeEntry
*Removes an entry from its location in the table*/
template<typename T, typename T2, typename T3>
void hashTable<T,T2,T3>::removeEntry(T3 searchEntry){
int key = hashKey(searchEntry);
while(iter != table[key].end() || searchEntry != *iter->getKey())
iter++;
if(*iter->getKey() == searchEntry)
table[key].erase(iter);
else
cout << "Can not delete Person (M" << number << "), NOT found!" << endl;
}
/*hashKey
*Hashes the given key in order to find its location in the table*/
template<typename T, typename T2, typename T3>
T hashTable<T,T2,T3>::hashKey(T3 key){
return key/1000;
}
這裏是我收到
1>------ Build started: Project: lab12, Configuration: Debug Win32 ------
1>Build started 4/2/2013 3:20:56 PM.
1>InitializeBuildStatus:
1> Touching "Debug\lab12.unsuccessfulbuild".
1>ClCompile:
1> recordsOffice.cpp
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(50): error C2327: 'hashTable<T,T2,T3>::size' : is not a type name, static, or enumerator
1> c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(57) : see reference to class template instantiation 'hashTable<T,T2,T3>' being compiled
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(50): error C2065: 'size' : undeclared identifier
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(51): warning C4346: 'std::list<T2>::iterator' : dependent name is not a type
1> prefix with 'typename' to indicate a type
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(51): error C2146: syntax error : missing ';' before identifier 'iter'
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(51): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(50): error C2327: 'hashTable<T,T2,T3>::size' : is not a type name, static, or enumerator
1> with
1> [
1> T=int,
1> T2=Person,
1> T3=int
1> ]
1> c:\users\angelo\google drive\advanced data structures\lab12\lab12\recordsoffice.h(35) : see reference to class template instantiation 'hashTable<T,T2,T3>' being compiled
1> with
1> [
1> T=int,
1> T2=Person,
1> T3=int
1> ]
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(50): error C2065: 'size' : undeclared identifier
1> lab12-main.cpp
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(50): error C2327: 'hashTable<T,T2,T3>::size' : is not a type name, static, or enumerator
1> c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(57) : see reference to class template instantiation 'hashTable<T,T2,T3>' being compiled
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(50): error C2065: 'size' : undeclared identifier
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(51): warning C4346: 'std::list<T2>::iterator' : dependent name is not a type
1> prefix with 'typename' to indicate a type
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(51): error C2146: syntax error : missing ';' before identifier 'iter'
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(51): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(50): error C2327: 'hashTable<T,T2,T3>::size' : is not a type name, static, or enumerator
1> with
1> [
1> T=int,
1> T2=Person,
1> T3=int
1> ]
1> c:\users\angelo\google drive\advanced data structures\lab12\lab12\recordsoffice.h(35) : see reference to class template instantiation 'hashTable<T,T2,T3>' being compiled
1> with
1> [
1> T=int,
1> T2=Person,
1> T3=int
1> ]
1>c:\users\angelo\google drive\advanced data structures\lab12\lab12\hashtable.h(50): error C2065: 'size' : undeclared identifier
1> Generating Code...
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.84
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
你如何使用這個散列表?我問,因爲目前有三種不同的模板類型在播放('T'大小,'T2'你存儲的,'T3'你散列找到存儲的'T2')。其中一些似乎沒有必要。 'T'(size)應該是'size_t'(因此_not_模板)。爲什麼將大小作爲模板參數?如果我使用散列表並提供'T' ='std :: string',會怎樣? 'T3'不是絕對必要的,(你應該能夠使用'T2'來找到一個'T2',但是如果'T2'不是微不足道的構造就可以理解。 – Chad
如果你把'T'模板化爲尺寸,因爲你希望散列表的大小可以在編譯時配置,你不應該在那裏使用typename,而應該使用size_t。像這樣:http://ideone.com/2RCc1M – Chad
T3是模板化的唯一原因是因爲T2是一個類包含幾個不同的整數和字符串,T3只是讓我更容易使用字符串而不是int來建立索引 – todaroa