Ошибка C2064 с использованием <функционала> и <bind>

Я действительно не знаю, что здесь делать. Каждый ответ, который я ищу, имеет синтаксис, который я просто не понимаю.

ошибка:

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;
}

Заранее спасибо.

3 ответа

Решение

Вам нужен заполнитель для несвязанного аргумента функции:

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() любые параметры.

Другие вопросы по тегам