2010-03-11 75 views
3

我正在爲hash_map編寫一些散列函數的例子。如果我使用由我的編譯器定義的hash_map,我需要在Hasher中定義Comparer。我知道最好使用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

class'StdDimHasher'有'Bar'作爲構造函數嗎? – Naveen 2010-03-11 09:35:35

+0

不,這是取代原名的錯誤。 謝謝! – flashnik 2010-03-11 09:40:16

+0

你是否打算能夠訪問Bar對象上的方法:virtual bool operator()(const Index2&ind1,const Index2&ind2)const?哦,它已經回答了...請不要刪除答案,以後很難獲得上下文 – mukeshkumar 2010-03-11 10:18:01

回答

4

類是用於名稱查找範圍和派生類是(仍然爲名稱查找的目的)嵌套在它們的基類。

當搜索到一個名字(並且operator()就是這樣一個名字)時,搜索停止在包含它的第一個作用域。它不會在爆發範圍內繼續發現潛在的超載。

這裏,在Bar範圍內搜索operator(),有一個,因此沒有找到Foo中帶有兩個參數的重載。

的解決方案是在酒吧添加

using Foo::operator(); 

+0

+1:爲確切的解釋和解決方案。我讀過使用解決方案不適用於某些編譯器。你有關於此的一些提示嗎? – neuro 2010-03-11 14:10:59

+0

我一直在使用它多年,我不記得有遇到過編譯器有問題。如果你有名字,我很感興趣。 – AProgrammer 2010-03-11 14:30:05

1

嗯,對你的調用環境更精確。在Foo中,你有2個不同的運算符()和StdDimHasher(我想你是指Bar),你重載了一個參數運算符()。我想你已經隱藏了operator()的2個args版本,所以編譯器只能看到一個arg版本。

MY2C

+0

我希望第二個版本能夠獲得基礎版本。 – flashnik 2010-03-11 11:27:58

+0

@flashnik:是的,我(是?)我自己充滿了這樣的希望。我們都認爲C++是一個聰明的東西,但它只是一個僵化的獨裁者;-) – neuro 2010-03-11 14:08:59