在C ++中是否可以继承operator()?

时间:2010-03-11 09:29:19

标签: c++ visual-c++ inheritance hashmap

我正在为hash_map编写一些哈希函数的例子。如果我使用编译器定义的hash_map,我需要在Hasher中定义Comparer。我知道使用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))

那么继承operator()是否可能?我的班级出了什么问题?

2 个答案:

答案 0 :(得分:4)

类是名称查找的范围,派生类(仍然用于名称查找的目的)嵌套在它们的基类中。

当搜索名称(并且operator()是这样的名称)时,搜索在包含它的第一个范围停止。它不会继续限制范围以发现潜在的过载。

这里,在Bar范围内搜索operator(),有一个,但是找不到Foo中有两个参数的重载。

解决方案是添加

using Foo::operator();

在Bar。

答案 1 :(得分:1)

嗯,更准确地说你的调用情境。在Foo中你有2个不同的运算符()和StdDimHasher(我猜你的意思是Bar)你重载了一个参数operator()。我想你已经隐藏了2个args版本的operator(),所以编译器只看到一个arg版本。

MY2C

相关问题