Возможно ли в C ++ наследовать operator ()? - PullRequest
3 голосов
/ 11 марта 2010

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

Так что я хотел бы реализовать компаратор в базовом классе 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))

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

Ответы [ 2 ]

4 голосов
/ 11 марта 2010

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

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

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

Решение состоит в том, чтобы добавить

using Foo::operator();

в баре.

1 голос
/ 11 марта 2010

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

my2c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...