Хэш-таблица не принимает функцию, переданную в конструктор в списке инициализации члена

У меня есть шаблон хеш-таблицы, который я написал для класса. У меня есть проект из-за использования этой хэш-таблицы. Он принимает целочисленное значение без знака для инициализации количества сегментов, которые он имеет, а также хеш-функцию для указания. Я еще не написал эту хэш-функцию, но у меня есть объявление для нее. Когда я пытаюсь использовать инициализатор члена в своем классе Game для члена данных хеш-таблицы, это выдает мне ошибку, которую я не понимаю.

Error 1 error C3867: 'Game::xorHash': function call missing argument list; use '&Game::xorHash' to create a pointer to member

2 IntelliSense: no instance of constructor "HTable<Type>::HTable [with Type=std::string]" matches the argument list
argument types are: (int, unsigned int (const std::string &s))

мой класс хэш-таблицы выглядит следующим образом:

#pragma once
#include "SLList.h"
template<typename Type> class HTable
{
public:
HTable(unsigned int numOfBuckets, unsigned int (*hFunction) (const Type &v));
~HTable();
HTable<Type>& operator=(const HTable<Type>& that);
HTable(const HTable<Type>& that);
void insert(const Type& v);
bool findAndRemove(const Type& v);
void clear();
int find(const Type& v) const;

private:
SLList<Type>* ht;
unsigned int (*hFunct) (const Type &v);
unsigned int numOfBuck;
};

template<typename Type>
HTable<Type>::HTable(unsigned int numOfBuckets, unsigned int (*hFunction) (const Type     &v))
{
ht = new SLList<Type>[numOfBuckets];
this->numOfBuck = numOfBuckets;
this->hFunct = hFunction;
}

template<typename Type>
HTable<Type>::~HTable()
{
delete [] ht;
ht = nullptr;
}

template<typename Type>
HTable<Type>& HTable<Type>::operator=(const HTable<Type>& that)
{
if(this != &that)
{
delete [] this->ht;
this->hFunct = that.hFunct;
this->numOfBuck = that.numOfBuck;
this->ht = new SLList<Type>[numOfBuck];
for(unsigned int i = 0; i < this->numOfBuck; i++)
this->ht[i] = that.ht[i];
}
return *this;
}

template<typename Type>
HTable<Type>::HTable(const HTable<Type>& that)
{
this = *that;
}

template<typename Type>
void HTable<Type>::insert(const Type& v)
{
ht[hFunct(v)].addHead(v);
}

template<typename Type>
bool HTable<Type>::findAndRemove(const Type& v)
{
SLLIter<Type> iter(ht[hFunct(v)]);
for(iter.begin(); !iter.end(); ++iter)
{
if(v == iter.current())
{
ht[hFunct(v)].remove(iter);
return true;
}
}
return false;
}

template<typename Type>
void HTable<Type>::clear()
{
for(unsigned int i = 0; i < this->numOfBuck; ++i)
ht[i].clear();
}

template<typename Type>
int HTable<Type>::find(const Type& v) const
{
SLLIter<Type> iter(ht[hFunct(v)]);
for(iter.begin(); !iter.end(); ++iter)
{
if(v == iter.current())
return hFunct(v);
}

return -1;
}

Моя Game.h:

#pragma once

#include "stdafx.h"#include "HTable.h"#include "BST.h"#include "DTSTimer.h"
using namespace std;

class Game
{
public:
Game(void);
virtual ~Game(void);
void refresh();
void input();
unsigned int xorHash(const string &s);

private:
string userInput;
DTSTimer timer;
BST<string> answers;
HTable<string> dictionary;
};

Мой Game.cpp (очевидно, это просто скелет, так как я не могу заставить члена init работать)

 #include "Game.h"

Game::Game(void) : dictionary(2048, xorHash)
{

}Game::~Game(void)
{

}

void Game::refresh()
{

}

void Game::input()
{

}

unsigned int Game::xorHash(const string &s)
{
return 0;
}

Я давно над этим работаю и бьюсь в стену. Я был бы очень признателен за помощь в настройке и запуске этой вещи. Дайте мне знать, если есть еще один фрагмент, который нужно посмотреть (я постарался быть тщательным в этом отношении).

0

Решение

У тебя две проблемы. Во-первых, вы неправильно передаете указатель на функцию-член (сообщение об ошибке сообщает вам, что именно нужно делать). Другая проблема заключается в том, что указатель на функцию не совпадает с член указатель на функцию

Указателю на функцию-член необходим объект объекта экземпляра для вызова функции-члена. И этот экземпляр передается как скрытый первый аргумент, чего нет у обычных функций.

Для этого вы можете вместо этого обратиться к std::function а также std::bind:

class HTable
{
public:
HTable(unsigned int numOfBuckets, std::function<unsigned int(const Type&)> hFunction);
...

private:
std::function<unsigned int(const Type&)> hFunct;
...
};

затем

Game::Game(void) : dictionary(2048, std::bind(&Game::xorHash, this))
{
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]