我编写了一个简单的程序,用于在Hash Table中插入数据,并使用C ++语言从中删除数据。我的程序错误是:未定义引用' HashTable :: insert(int&)' 如何解决此错误?
#include <iostream>
#include <list>
#include <vector>
using namespace std;
我创建一个模板以提供所有变量。
template <typename HashedObj>
class HashTable {
public:
explicit HashTable(int cusize = 101) {}
bool contains(const HashedObj& x) const
{
auto& whichList = theLists[myhash(x)];
return find(begin(whichList), end(whichList), x) != end(whichList);
}
void makeEmpty()
{
for (auto& thisList : theLists)
thisList.clear();
}
bool insert(const HashedObj& x)
{
auto& whichList = theLists[myhash(x)];
if (find(begin(whichList), end(whichList), x) != end(whichList))
return false;
whichList.push_back(x);
//Rehash
if (++currentSize > theLists.size())
rehash();
return true;
}
bool insert(HashedObj& x);
bool remove(const HashedObj& x)
{
auto& whichList = theLists[myhash(x)];
auto itr = find(begin(whichList), end(whichList), x);
if (itr == end(whichList))
return false;
whichList.erase(itr);
--currentSize;
return true;
}
private:
vector<list<HashedObj>> theLists; //The array of Lists
int currentSize;
void rehash();
size_t myhash(const HashedObj& x) const
{
static hash<HashedObj> hf;
return hf(x) % theLists.size();
}
};
在main函数中,我创建一个带有int变量的HashTable,并向其插入10个数字,但编译器在插入函数的 test = t.insert(i); 时出错。
int main()
{
HashTable<int> t;
bool test;
for (int i = 0; i < 10; i++) {
test = t.insert(i);
}
}
答案 0 :(得分:2)
您的代码中似乎有两个bool insert(params)函数:
bool insert(const HashedObj& x)
{
auto& whichList = theLists[myhash(x)];
if (find(begin(whichList), end(whichList), x) != end(whichList))
return false;
whichList.push_back(x);
//Rehash
if (++currentSize > theLists.size())
rehash();
return true;
}
在这里:
bool insert(HashedObj& x);
删除其中一个。
编辑:正如@DietmarKühl建议的那样,你应该删除第二个实现。
答案 1 :(得分:0)
您声明了两个insert
个函数,第一个函数使用了const HashedObj&
个参数,第二个函数使用了HashedObj&
个参数。
test = t.insert(i);
i
这里是一个非const变量,所以它匹配第二个插入函数,但你没有实现它。
如果删除第二个insert
声明,它可以很好地工作,因为编译器会自动将i
转换为const int&
类型。