2010-03-11 2 views
3

Я пишу несколько примеров хеш-функций для hash_map. Если я использую hash_map, определенный моим компилятором, мне нужно определить Comparer в Hasher. Я знаю, что лучше использовать tr1 :: unordered_map, но в моем приложении важно установить минимальное количество ведер, довольно больших, и определить среднее значение bucket_size - условие для роста.Возможно ли в C++ наследовать operator()?

Так что я хотел бы использовать компаратор в базовом классе Foo и наследовать его в других хэстерах, таких как Bar.

class Foo 
{ 
public: 
    Foo(const SeedParam& dim); 
    Foo(const Foo& src); 
    Foo& operator = (const Foo& src); 
    virtual bool operator()(const Index2& ind1, const Index2& ind2) const; 
    size_t operator() (const Index2& ind) const; 

    enum 
    { 
     bucket_size = 4, 
     min_buckets = 32768, 
    }; 
protected: 
    SeedParam _dim; 
    const hash_compare<unsigned long long> _stdHasher; 
}; 

class Bar: public Foo 
{ 
public: 
    Bar(const SeedParam& dim); 
    size_t operator() (const Index2& ind) const; 
}; 

Но составители говорят, что «термин не вычисляется функция принимает два аргумента» при компиляции такого кода в hash_map:

if (!this->comp(this->_Kfn(*_Where), _Keyval)) 

Так можно ли наследовать оператор()? Что случилось с моими классами?

+0

класс 'StdDimHasher' имеет конструкцию' Bar'? – Naveen

+0

Нет, это была ошибка при замене оригинальных имен. Спасибо! – flashnik

+0

Вы собираетесь иметь доступ к методу: virtual bool operator() (const Index2 и ind1, const Index2 и ind2) const на объекте Bar? О, он уже ответил ... пожалуйста, не удаляйте ответы, сложно получить контекст позже. – mukeshkumar

ответ

4

Классы области для поиска имен и производные классы (до сих пор с целью поиска имен) вложен в их базовом классе.

При поиске имени (и оператор() является таким именем), поиск останавливается в первой области, в которой он содержится. Оно не продолжается в области охвата, чтобы найти потенциальную перегрузку.

Здесь один поиск оператора() в области Bar, есть один, и поэтому перегрузка с двумя параметрами в Foo не найдена.

Решение добавить

using Foo::operator(); 

в баре.

+0

+1: для точного объяснения и решения. Я читал, что используемое решение не работает с некоторыми компиляторами. У вас есть какие-то намеки на это? – neuro

+0

Я использую его в течение многих лет, и я не помню, чтобы встретиться с компилятором, на котором возникла проблема. Если у вас есть имена, мне интересно. – AProgrammer

1

Ну, точнее, ваш контекст вызова. В Foo у вас есть 2 разных оператора operator(), а в StdDimHasher (я полагаю, вы имеете в виду Bar) вы перегружаете один аргумент operator(). Я полагаю, что вы скрыли версию args версии 2 args, поэтому компилятор видит только одну версию arg.

my2c

+0

Я надеялся, что вторая версия получит базовую версию. – flashnik

+0

@flashnik: Да, я (был?) Сам полон таких надежд. Мы все думаем, что C++ - это умная вещь, но это всего лишь жесткий диктатор ;-) – neuro

Смежные вопросы