Я действительно не знаю, что здесь делать. Каждый ответ, который я ищу, имеет синтаксис, который я просто не понимаю.
ошибка:
Error 1 error C2064: term does not evaluate to a function taking 1 arguments
Я использую указатель функции в конструкторе хеш-таблицы. Было предложено использовать заголовки и для решения проблемы, с которой я столкнулся. Это решило ошибки, но я столкнулся с вышеуказанной ошибкой.
моя декларация хэш-таблицы и ctor следующие:
#pragma once
#include "SLList.h"
template<typename Type> class HTable
{
public:
HTable(unsigned int numOfBuckets, std::function<unsigned int(const Type&)> hFunction);
~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;
std::function<unsigned int(const Type&)> hFunct;
unsigned int numOfBuck;
};
template<typename Type>
HTable<Type>:: HTable(unsigned int numOfBuckets, std::function<unsigned int(const Type&)> hFunction)
{
ht = new SLList<Type>[numOfBuckets];
this->numOfBuck = numOfBuckets;
this->hFunct = hFunction;
}
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 (я пытаюсь передать функцию xorHash)
#include "Game.h"
Game::Game(void) : dictionary(2048, std::bind(&Game::xorHash, this))
{
}Game::~Game(void)
{
}
void Game::refresh()
{
}
void Game::input()
{
}
unsigned int Game::xorHash(const string &s)
{
return 0;
}
Заранее спасибо.
Вам нужен заполнитель для несвязанного аргумента функции:
std::bind(&Game::xorHash, this, std::placeholders::_1)
Лямбда может быть более читабельной, по вкусу:
[this](const std::string & s){return xorHash(s);}
Хотя мне не понятно почему xorHash
должен быть нестатическим членом вообще; неужели хеш должен зависеть только от его ввода?
xorHash
это метод, который принимает 1 аргумент Это означает, что он также неявно принимает this
указатель.
Сделай это static
метод или свободная функция вне class
,
Объект хеш-функции, который вы хотите передать, по-прежнему должен принимать значение для хеша в качестве аргумента. То есть вы хотите связать что-то вроде
std::bind(&Game::xorHash, this, std::placeholders::_1)
_1
-бит нужен, чтобы сказать std::bind()
где должен быть указан аргумент и какой из них отправить (какой не очень интересен в этом контексте, так как будет только один; более интересно, если вы связываете функции, которые должны получать несколько аргументов).
Обратите внимание, что на самом деле маловероятно, что вы хотите передать реальную функцию-член: обычно вычисляемое значение хеш-функции не зависит от состояния объекта, т. Е. Вам, вероятно, лучше сделать xorHash()
static
функция-член вашего класса и передать это: таким образом, вам даже не нужно std::bind()
любые параметры.