2013-02-23 117 views
0

我採取一個哈希表我自己,發現了以下錯誤:C++模板類編譯錯誤

19 template <class key, class value> 
20 class HashEntry { ... } 

60 template <class key, class value> 
61 class HashTable 
62 { 
63 
64 private: 
65  size_t _tableSize; 
66  HashEntry<key, value>** _table; 
67 
68 public: 
69 
70  HashTable(size_t s) 
71  { 
72   _tableSize = s; 
73   _table = (HashEntry<key, value>**) smalloc(s * sizeof(HashTable<key, value>*)); 
74  } 
75 
76  void addEntry(HashEntry<key, value>(key k, value v)) <--- 
77  { 
78 
79  } 
80 
... 
91 }; 

93 int main() 
94 { 
95  HashTable<int, string> t(100); 
96  t.addEntry(HashEntry<int, string>(1, string("a"))); <--- 

HASH_chaining.cc:96: error: no matching function for call to ‘HashTable<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::addEntry(HashEntry<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)’ 
HASH_chaining.cc:76: note: candidates are: void HashTable<key, value>::addEntry(HashEntry<key, value> (*)(key, value)) [with key = int, value = std::basic_string<char, std::char_traits<char>, std::allocator<char> >] 

在一眼,我便無法找到任何毛病。我認爲它與我定義addEntry接口的方式有關。

謝謝。

+3

將'void addEntry(HashEntry (key k,value v))'改爲'void addEntry(key k,value v)'? – ildjarn 2013-02-23 00:35:00

+0

ildjarn謝謝! – Figo 2013-02-23 00:38:24

回答

3

你不能在參數列表中提取東西(看起來就是你想要做的)。

更改addEntry功能,使得它的簽名可以是:

void addEntry(HashEntry<key, value> h) 

void addEntry(key k, value v) 

第二個好像在我看來更清潔,但如果你真的想調用者構建HashEntry出於某種原因,第一個也很好。

+0

我剛剛嘗試void addEntry(HashEntry h),它的工作原理。一旦提到,我懷疑爲什麼我把它放在第一個方法:( – Figo 2013-02-23 00:38:56

+0

不可否認,除了使代碼更乾淨並使對變得更容易外,HashEntry類幾乎不是必須的。 – Figo 2013-02-23 00:39:59

+0

那麼,這兩個選項誰的意圖構成這兩個人是根本不同的,這取決於你自己決定。 – us2012 2013-02-23 00:41:33