代码之家  ›  专栏  ›  技术社区  ›  flashnik

在C++中继承操作符()是可能的吗?

  •  3
  • flashnik  · 技术社区  · 14 年前

    我正在为哈希图编写一些哈希函数的示例。如果我使用编译器定义的散列映射,我需要在散列中定义比较器。我知道最好使用tr1::unordered_map,但在我的应用程序中,重要的是设置相当大的bucket的最小数量,并定义平均bucket_大小-一个增长的条件。

    所以我想在基类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;
    };
    

    但编译器表示,在散列图中编译此类代码时,“一个术语的计算结果不是采用两个参数的函数”:

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

    那么可以继承operator()吗?我的课怎么了?

    2 回复  |  直到 14 年前
        1
  •  4
  •   AProgrammer    14 年前

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

    当搜索一个名称(operator()就是这样的名称)时,搜索将停止在包含该名称的第一个作用域。它不会在包含范围内继续查找潜在的过载。

    这里,在bar范围内搜索operator(),有一个,因此在foo中找不到具有两个参数的重载。

    解决办法是增加

    using Foo::operator();
    

    在Bar。

        2
  •  1
  •   neuro    14 年前

    好吧,对你的通话环境更准确些。在foo中有两个differentoperator(),在stddimhasher中(我想您的意思是bar),您重载了一个参数operator()。我想您已经隐藏了operator()的2个参数版本,所以编译器只看到一个参数版本。

    MY2C