我必须创建一个模板化的哈希表,但是每当我尝试编译它时,我都会收到几个错误,说有未声明的标识符,并且模板不是类型名。问题出在 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 ==========