В качестве учебного упражнения я хотел создать свой собственный класс Hash Table (да, я знаю о std :: unordered_map и std :: unordered set). Итак, я написал этот код:
using std::cout;
using std::endl;
using std::vector;
using std::unique_ptr;
template <class K, class V, class U=std::hash<K>>
class hashTable
{
int order=0;
vector<myNode<K, V>> nodes;
public:
hashTable(U u = U()){}; // : hashPtr(u)
size_t gethash(K key, int level=0, const U & u=U());
};
template<class K, class V, class U>
size_t hashTable<K, V, U>::gethash(K key, int level, const U & u)
{
return u(key) % divisors[level];
}
И он прекрасно компилируется и делает то, что я ожидаю, когда в основном у меня есть:
hashTable<int,int> hast;
for(int i=0;i<40;++i)
cout << "hash of "<<i<<" is " << hast.gethash(i, 2) << endl;
Однако, когда я пишу следующую функцию:
size_t nodeHash(myNode<int,int> node) {
int i = node.getkey();
int j = node.getvalue();
std::hash<int> hash_fn;
return hash_fn(i)+hash_fn(j);
}
и в основном пишу:
hashTable < myNode<int, int>, int, nodeHash> hashMyNode;
Я получаю ошибку компиляции: функция "nodeHash" не является именем типа.
Я знаю, что не знаю, что делаю, потому что эти шаблонные функции являются новыми для меня. Кажется, я знаю достаточно, чтобы быть «опасным». Однако, если бы кто-то смог подтолкнуть меня в правильном направлении или дать мне полноценное решение для включения внешней функции в класс (как это делает std :: unordered_map или std :: sort), я, безусловно, был бы признателен.
Edit:
auto node = myNode<int, int>(1, 3);
hashTable < myNode<int, int>, int, size_t (*)(myNode<int,int> node)> hashMyNode;
hashMyNode.gethash(node, 2, nodeHash);
Я получаю следующие ошибки:
Severity Code Description Project File Line Suppression State
Error (active) E1776 function "myNode<K, V>::myNode(const myNode<int, int> &) [with K=int, V=int]" (declared implicitly) cannot be referenced -- it is a deleted function somePrime E:\source\repos\somePrime\somePrime.cpp 139
и
Severity Code Description Project File Line Suppression State
Error C2280 'myNode<int,int>::myNode(const myNode<int,int> &)': attempting to reference a deleted function somePrime e:\source\repos\someprime\someprime.cpp 139
это относится к переменной узла.