我正在为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()是否可能?我的班级出了什么问题?
答案 0 :(得分:4)
类是名称查找的范围,派生类(仍然用于名称查找的目的)嵌套在它们的基类中。
当搜索名称(并且operator()是这样的名称)时,搜索在包含它的第一个范围停止。它不会继续限制范围以发现潜在的过载。
这里,在Bar范围内搜索operator(),有一个,但是找不到Foo中有两个参数的重载。
解决方案是添加
using Foo::operator();
在Bar。
答案 1 :(得分:1)
嗯,更准确地说你的调用情境。在Foo中你有2个不同的运算符()和StdDimHasher(我猜你的意思是Bar)你重载了一个参数operator()。我想你已经隐藏了2个args版本的operator(),所以编译器只看到一个arg版本。
MY2C