c++ - hashTable 模板化实现的问题

标签 c++ hashtable

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

最佳答案

问题就在这里

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

1 这是错误的。

list<T2> table[size];

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

应该只是

list<T2> table;

2 这需要typename

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 (而不是数组)。

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

(取决于您的需要。More info on containers)

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

关于c++ - hashTable 模板化实现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15773727/

相关文章:

c++ - 如何将 16 位值数组转换为 base64?

c++ - 为什么当数组有重复值时快速排序算法持续时间会增加?

c - 初始化哈希表的问题

java - Java Hashmap 中的 Capacity 和 indexFor

c++ - 预期的不合格 ID 错误,最有可能的原因是什么?

c++ - 用户定义的数组大小

c - GHashTable 对两个相同输入的响应完全不同

ruby 哈希表使用现有键插入新元素

emacs - 遍历Emacs Lisp哈希表

c++ - 单击不同窗口上的按钮时更改类的参数