проблема компиляции с разными версиями gcc - PullRequest
0 голосов
/ 28 октября 2019

gcc версия 4.4.6 успешно компилирует код. Но gcc версии 4.8.1 выдает ошибку компиляции.

/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <iostream>

using namespace std;

class AbstractHashSet
{
    protected :
    int size;
    float load_factor;
    int current_limit;
    public :
    AbstractHashSet() : size(0), load_factor(0.75), current_limit(0){}
    int getSize(void) const { return size; }
    bool isEmpty(void) const { return size == 0; }
    float getLoadFactor(void) const {   return load_factor; }
    int getCapacity(void) const { return current_limit; }
    static int get_preferred_size(int n);
};

template<class KEY>
struct HashSetBaseElement
{
    KEY key;
    HashSetBaseElement *next;
    HashSetBaseElement(KEY k) : key(k),next(NULL){}
    virtual ~HashSetBaseElement(){}
};

template<class KEY>
class HashSetBase : public AbstractHashSet
{
    public :
    bool contains(KEY key)
    {
        if (size == 0) return false;
        return get_element(key) != NULL;
    }
    protected :
    HashSetBaseElement<KEY> *get_element(KEY key)
    {
        return NULL;
    }
};

template<class KEY>
class HashSet : public HashSetBase<KEY>
{
    public :
    HashSet(int n = 10)
    {
        HashSetBase<KEY>::setCapacity(n);
    }
    bool add(KEY key)
    {
        HashSetBaseElement<KEY> *e = get_element(key);
        if (e) return false;
        e =  new HashSetBaseElement<KEY>(key);
        return true;
    }
};
template<class KEY_T, class VALUE_T>
class HashMap : public HashSetBase<KEY_T>
{
    protected :
    struct Entry : public HashSetBaseElement<KEY_T>
    {
        VALUE_T value;
        Entry(KEY_T key, VALUE_T value) : HashSetBaseElement<KEY_T>(key), value(value){}
    };
    VALUE_T empty_value;

    public:
    VALUE_T &get(KEY_T key)
        {
            Entry *e = (Entry*)get_element(key);
            if (e) return e->value;
            return empty_value;
        }       
};

    struct Space
        {
            friend bool operator<(const Space &a, const Space &b)   
            {   return true;    }
            friend bool operator>(const Space &a, const Space &b)   
            {   return true;    }
        };
int main()
{    
    HashMap<int,Space*> pos_map;
    pos_map.get(100);
    cout<<"Hello World";

    return 0;
}

Ошибка компиляции:

Ошибка (и): source_file.cpp: В экземпляре 'VALUE_T & HashMap :: get (KEY_T) [с KEY_T = int;VALUE_T = Space *] ': source_file.cpp: 98: 20: требуется отсюда

source_file.cpp: 82: 34: ошибка:' get_element 'не был объявлен в этой области, и никакие объявления не были найденызависимый от аргумента поиск в точке создания [-fpermissive]

Entry e = (Entry ) get_element (key);

source_file.cpp: 82: 34:примечание: объявления в зависимой базе -> 'HashSetBase' не найдены неквалифицированным поиском

source_file.cpp: 82: 34: примечание: используйте вместо этого '101-> get_element'

1 Ответ

0 голосов
/ 30 октября 2019

наконец, у меня есть единственная проблема, изменив эту строку кода: this-> get_element;

...