指针对象未在范围内声明

时间:2015-12-01 04:06:07

标签: c++ pointers hashtable declaration

这让我发疯了。在搜索功能定义中,Dev c ++说的是

item* temp = HT[index];
宣布

超出范围。为什么会这样?我不能为我的生活弄清楚。在其他函数中有这一行代码的变体,编译器对它们没有任何问题。我非常感谢你的帮助,谢谢你。

编辑:对不起大家,我的不好。我删除了很多不必要的代码,以便于阅读。如果您想知道为什么功能或某些东西丢失,那是因为我将其删除了。我在代码中添加了一些注释,我遇到了问题。

//-----hash.h---------------------------------
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
#define TABLESIZE 13
#ifndef HASH_H
#define HASH_H

namespace HTGroup
{
    template<class T>
    class HashTable
{
    protected:
        struct item {
            T x;
            item* next;
        };
        item* HT[TABLESIZE];
        virtual int hash(T key) = 0;
        virtual int collision(T key, int &value) = 0;
    public:
        HashTable();
        virtual void printGrid();
        void insert(T key);
        void remove(T key);
        void search(T key);
        int indexItems(int index);
    };

    template<class T>
    class DHT1 : public HashTable<T>
    {
    protected:
        int hash(T key);
        int collision(T key, int &value);
        struct item {
            T x;
            item* next;
        };
        item* HT[TABLESIZE];
    public:
        DHT1();
        void printGrid();
    };

    template<class T>
    class DHT2 : public HashTable<T>
    {
    protected:
        int hash(T key);
        int collision(T key, int &value);
        struct item {
            T x;
            item* next;
        };
        item* HT[TABLESIZE];
    public:
        DHT2();
        void printGrid();
    };
}

#endif


//---hash.cpp--------------------------------------------------
#include <iostream>
#include <string>
#include <cstdlib>
#include "hash.h"
#define TABLESIZE 1
using namespace std;

namespace HTGroup
{  
    template<class T>
    void HashTable<T>::remove(T key)
    {
        int index = hash(key);

        item* delPtr;
        item* P1;
        item* P2;

        //I deleted the rest of this definition to save space.
        //The reason I kept the above code was to show that 
        //'item*' was being used in this function without any problem. 
        //In search, however, it says 'item*' is out of scope.         
    }

    template<class T>
    void HashTable<T>::search(T key)
    {
        int index = hash(key);
        bool foundKey = false;
        string item;


        item* temp = HT[index];
        while(temp != NULL)
        {
            if(temp->x == key)
            {
                foundKey = true;
                item = temp->x;
            }
            temp = temp->next;
        }

        //Deleted a few if statements from this one. The code above 
        //is causing the trouble. Specifically, "item* temp = HT[index]".
        //The compiler says it is declared out of scope. 

    }

//----main.cpp--------------------------------------------------

#include <iostream>
#include <string>
#include <cstdlib>
#include "hash.cpp"
//using namespace std;
using namespace HTGroup;

#define TABLESIZE 13

int main(int argc, char** argv) {

    return 0;
}

1 个答案:

答案 0 :(得分:0)

编译器在解析类型item时遇到问题,因为它与一个名为item的本地字符串变量(在上面声明)发生冲突。

您可以为该字符串使用其他名称,也可以完全限定item类型的名称,如下所示:

HashTable<T>::item * temp = HT[index];

使用命名约定可能会帮助您使用强制使用不与变量名冲突的类型名称。 C ++中的一个常见约定是类型名称以大写字母开头。