1
我在使用Xcode IDE進行C++編程時是全新的。我所做的是我自己創建了一個Hashtable,並單擊了構建按鈕,因此我得到了編譯錯誤。有沒有人有什麼錯誤的想法?構建錯誤:體系結構x86_64的未定義符號:
這是錯誤:
Undefined symbols for architecture x86_64:
"MyHashtable<std::string, int>::MyHashtable(int)", referenced from:
_main in main.o
"MyHashtable<std::string, int>::Insert(std::string, int)", referenced from:
_main in main.o
"MyHashtable<std::string, int>::GetKeys()", referenced from:
_main in main.o
"MyHashtable<std::string, int>::GetLength()", referenced from:
_main in main.o
"MyHashtable<std::string, int>::GetValue(std::string)", referenced from:
_main in main.o
"MyHashtable<std::string, int>::~MyHashtable()", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
哈希表的cpp文件是這樣的:
#include <iostream>
#include "Hashtable.h"
#include <string>
template<typename T1,typename T2>
MyHashtable<T1,T2>::MyHashtable(int iSlots)
{
if(iSlots<5) iSlots = 5;
m_hashSlots = new HashElement<T1,T2>*[iSlots];
m_hashSlots = iSlots;
m_Length = 0;
}
template<typename T1,typename T2>
MyHashtable<T1,T2>::~MyHashtable()
{
if(m_hashSlots)
{
HashElement<T1, T2> * phead;
for(int i = 0;i<m_NumSlots;i++)
{
phead = m_hashSlots[i];
while(phead!=0)
{
HashElement<T1, T2>* pNext = phead->next;
delete phead;
phead = pNext;
}
}
delete m_hashSlots;
m_hashSlots = 0;
}
}
template<typename T1,typename T2>
int MyHashtable<T1,T2>::HashKey(T1 key)
{
char* keyString = (char*)key;
int keyNum = 0;
for(int i = 0;i<strlen(keyString);i++)
{
int ascK = keyString[i];
keyNum += ascK;
}
return keyNum%m_NumSlots;
}
template<typename T1,typename T2>
T1* MyHashtable<T1,T2>::GetKeys()
{
T1* keys = new T1[m_Length];
int index = 0;
for(int i = 0;i<m_NumSlots;i++)
{
HashElement<T1,T2> *phead = m_hashSlots[i];
while(phead!=0)
{
keys[index] = phead->key;
index++;
phead = phead->next;
}
}
return keys;
}
template<typename T1,typename T2>
T2 MyHashtable<T1,T2>::GetValue(T1 key)
{
int index = HashKey(key);
HashElement<T1,T2> *phead = m_hashSlots[index];
while(phead)
{
if(phead->key==key)
return phead->value;
else
phead = phead->next;
}
return NULL;
}
template<typename T1,typename T2>
int MyHashtable<T1,T2>::GetLength()
{
return m_Length;
}
template<typename T1,typename T2>
bool MyHashtable<T1,T2>::Insert(T1 key, T2 value)
{
int index = HashKey(key);
HashElement<T1,T2> *phead = m_hashSlots[index];
while(phead)
{
if(phead->key == key) {
int newValue = (int)(phead->value);
newValue += int(value);
return true;
} else {
phead = phead->next;
}
}
HashElement<T1,T2>* newNode = new HashElement<T1,T2>();
newNode->key = key;
newNode->value = value;
phead->next = newNode;
return true;
}
它的工作,非常感謝! – faz