0

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

1 回答 1

1

问题就在这里

private:
    T size;
    list<T2> table[size]; 
    list<T2>::iterator iter;

1 这是错误的。

list<T2> table[size];

这不是列表的声明方式。即使这是一个普通数组,你也不能size在那里使用,因为 size 不是static. 编译器不知道size创建实例hashTable以分配数组时的值。

应该只是

list<T2> table;

2 这需要类型名

list<T2>::iterator iter;

编译器需要知道您正在声明iter并且 a 需要类型说明符。您可以通过在声明中添加 typename 来帮助他。

应该

typename list<T2>::iterator iter;

所以总结一下

T size;
list<T2> table;  // HERE
typename list<T2>::iterator iter; // HERE

如果你想要一组列表(不是一个列表)。您可以使用列表的向量(而不是数组)。

vector< list<T2> > table;   OR
list< list<T2> > table;

(取决于您的需要。有关容器的更多信息

但要小心这一点。复制这些对象可能很昂贵。尽可能通过引用传递或使用指针。

于 2013-04-02T20:47:17.053 回答