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 = Пробел *] ’: source_file.cpp: 98: 20: отсюда требуется
source_file.cpp: 82: 34: ошибка: «get_element» не был объявлен в этой области, и никакие объявления не были найдены зависимым от аргументов поиском в точке создания экземпляра [-fpermissive]
Запись e = (Запись) get_element (ключ);
source_file.cpp: 82: 34: примечание: объявления в зависимой базе -> «HashSetBase» не найдены неквалифицированным поиском
source_file.cpp: 82: 34: примечание: используйте вместо этого ‘this-> get_element’
clear()
и значениеempty_value
. - person Benjamin Bihler   schedule 29.10.2019