todaroa
todaroa

Reputation: 339

Problems with hashTable templated implementation

I have to created a templated hashTable, however whenever I attempt to compile it, I receive several errors saying there are undeclared identifiers, and that the templates are not a typename when they are. The problem is specifically in the hashTable class.

//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;
    }

Here are the errors that I receive

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 ==========

Upvotes: 0

Views: 1132

Answers (1)

user995502
user995502

Reputation:

The problems are here

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

1 This is wrong.

list<T2> table[size];

That is not how lists are declared. And even if this was a normal array you can't use size there because size is not a static. The compiler doesn't know the value of size when creating an instance of hashTable to allocate the array.

Should be just

list<T2> table;

2 This needs typename

list<T2>::iterator iter;

The compiler needs to know that you are declaring iter and a expects a type specifier. You can help him by adding typename to the declaration.

Should be

typename list<T2>::iterator iter;

So to summerize

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

if you want an array of lists (not one list). you can use vector (instead of array) of lists.

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

(depending on your needs. More info on containers)

But be careful with this. Copying this objects can be expensive. Pass by references or use pointers when you can.

Upvotes: 1

Related Questions