我是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;
}
你在濫用命名空間std;'。停下來。現在停下來,而你仍然可以。尋求專業幫助,如果一切都失敗了。這不是犯罪,也不會讓你成爲一個壞人,我們都在這裏支持你。 –
你可能想把你的函數聲明放在你第一次使用它們的地方之上(現在你可能指的是std :: hash,這正是你不應該使用'namespace std;'的原因)。並且你沒有定義int hash(const string & key);'。Identity是一個可怕的整數散列函數,而且你的散列函數似乎並不依賴於你的表容量,這似乎有點奇怪我使用 – Cubic
@KerrekSB只要你在源文件中而不是在頭文件中使用namespace std;(或任何其他命名空間),沒有什麼錯誤,期望人們總是限定每個庫名稱是可笑的std ::。你會說C#和System.Windows.Controls這樣的命名空間是一樣的嗎?希望人們不要在頭文件中這樣做,但這確實會引入問題(這是C++過時的模塊系統的錯誤) 。 – user1610015