2012-10-21 97 views
3

我是C++新手。這是我的家庭作業,下面是教授給我們的幫助我們完成這項任務的代碼,但它不能編譯......我標記了產生錯誤的那一行,錯誤消息是 「如果沒有模板參數列表,不能引用模板'哈希'」。
我不知道如何解決它。請有人指點我正確的方向嗎?
(我已經去除了線,我假定,是無關的錯誤消息。)不能引用沒有模板參數列表的類模板

的類定義爲:

template <typename HashedObj> 
class HashTable 
{ 
public: 
    //.... 
private: 
    struct HashEntry 
    { 
     HashedObj element; 
     EntryType info; 
     HashEntry(const HashedObj & e = HashedObj(), EntryType i = EMPTY) 
      : element(e), info(i) { } 
    }; 

    vector<HashEntry> array; 
    int currentSize; 

    //... some private member functions.... 

    int myhash(const HashedObj & x) const 
    { 
     int hashVal = hash(x); <<--- line with error 

     hashVal %= array.size(); 
     if(hashVal < 0) 
      hashVal += array.size(); 

     return hashVal; 
    } 
}; 

int hash(const HashedObj & key); 
int hash(int key); 

---和INT散列()函數在CPP文件----

int hash(const string & key) 
{ 
    int hashVal = 0; 
    for(int i = 0; i < key.length(); i++) 
     hashVal = 37 * hashVal + key[ i ]; 

    return hashVal; 
} 

int hash(int key) 
{ 
    return key; 
} 
+0

你在濫用命名空間std;'。停下來。現在停下來,而你仍然可以。尋求專業幫助,如果一切都失敗了。這不是犯罪,也不會讓你成爲一個壞人,我們都在這裏支持你。 –

+1

你可能想把你的函數聲明放在你第一次使用它們的地方之上(現在你可能指的是std :: hash,這正是你不應該使用'namespace std;'的原因)。並且你沒有定義int hash(const string & key);'。Identity是一個可怕的整數散列函數,而且你的散列函數似乎並不依賴於你的表容量,這似乎有點奇怪我使用 – Cubic

+0

@KerrekSB只要你在源文件中而不是在頭文件中使用namespace std;(或任何其他命名空間),沒有什麼錯誤,期望人們總是限定每個庫名稱是可笑的std ::。你會說C#和System.Windows.Controls這樣的命名空間是一樣的嗎?希望人們不要在頭文件中這樣做,但這確實會引入問題(這是C++過時的模塊系統的錯誤) 。 – user1610015

回答

3

我懷疑你是using namespace std;(我可以告訴你,因爲使用vector沒有std::)和std命名空間中存在一個名字hash,故得名的衝突。

您應該使用std::,而不是把整個std命名空間,尤其是一個頭文件,其中一個無辜的用戶可以#include它與std污染他們的計劃了。

+0

它*是*名稱衝突!謝謝,Seth! :) – selina

+2

你也可以'使用std :: vector;'如果你提到'vector'這個名字很多並且想縮寫它。這樣可以避免將數百個其他名稱拖入您從未聽說過的範圍。 –

相關問題