gpt4 book ai didi

c++ - 将 boost::bind 成员函数传递给 wt 监听器。我做错了什么?

转载 作者:行者123 更新时间:2023-11-30 01:52:59 25 4
gpt4 key购买 nike

这个问题花了我好几个小时,但我有点不明白我做错了什么。

这是编译错误信息:

Error 113 error C2298: 'return' : illegal operation on pointer to member function expression c:\program files\wt 3.3.2 msvs2012 x86\include\boost\bind\mem_fn.hpp 342 1 Monopoly

错误位于 mem_fn.hpp 中的函数 dm::operator() 中。我粘贴了文件 here (第 342 行)。

我猜测问题源于 boost::bind(),但我检查了我绑定(bind)的函数,它们似乎都具有正确数量的参数。

#include <Wt/WApplication>
#include <Wt/WPushButton>
#include <Wt/WTable>
#include <Wt/WEnvironment>
#include <Wt/WServer>
#include <vector>

using namespace Wt;
using std::vector;
using std::string;

enum Tile {
N, X, O
};



class TicTacToeGame;

class TicTacToeClient: public WApplication {
public:
TicTacToeClient(const WEnvironment& env);

void connectFrom(TicTacToeGame& game);

void setTile(Tile t);

void updateBoard(int, int, Tile);

private:
void takeMove(int i, int j);
Tile tile;
Signal<int, int, Tile>* moveTaken;
WTable* table;

};




class TicTacToeGame {
public:
static vector<TicTacToeGame*> games;

TicTacToeGame(TicTacToeClient* x): playerX(x) {
for(int i=0;i<3;i++){
vector<Tile> line;
for(int j=0;j<3;j++)
line.push_back(Tile::N);
grid.push_back(line);
}
playerX->connectFrom(*this);
playerX->setTile(Tile::X);
playerX->enableUpdates();
}

void updateBoard(int x, int y, Tile t){
playerX->environment().server()->post(playerX->sessionId(), boost::bind(&TicTacToeClient::updateBoard, playerX, x, y, t));
playerO->environment().server()->post(playerO->sessionId(), boost::bind(&TicTacToeClient::updateBoard, playerO, x, y, t));
}

void join(TicTacToeClient* o){
playerO = o;
playerO->connectFrom(*this);
playerO->setTile(Tile::O);
playerO->enableUpdates();
}

private:
vector<vector<Tile>> grid;
TicTacToeClient* playerX;
TicTacToeClient* playerO;
};

vector<TicTacToeGame*> TicTacToeGame::games = vector<TicTacToeGame*>();

TicTacToeClient::TicTacToeClient(const WEnvironment& env): WApplication(env), moveTaken(new Signal<int, int, Tile>){
WTable* table = new WTable();
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
WPushButton* button = new WPushButton();
button->setWidth(50);
button->setHeight(50);
button->clicked().connect(boost::bind(&TicTacToeClient::takeMove, this, i, j));
WTableCell* cell = table->elementAt(i,j);
cell->addWidget(button);
cell->setHeight(50);
cell->setWidth(50);
}
}
root()->addWidget(table);
this->table = table;
}

void TicTacToeClient::connectFrom(TicTacToeGame& game){
moveTaken->connect(boost::bind(&TicTacToeGame::updateBoard, &game));
}

void TicTacToeClient::setTile(Tile t){tile = t;}

void TicTacToeClient::updateBoard(int x, int y, Tile t){
WTableCell* cell = table->elementAt(x, y);
cell->clear();
string text;
switch(t){
case Tile::X:
text = "X";
break;
case Tile::O:
text = "O";
break;
}
cell->addWidget(new WText(text));
}


void TicTacToeClient::takeMove(int i, int j){
moveTaken->emit(i, j, tile);
}

WApplication *createApplication(const WEnvironment& env)
{
TicTacToeClient* client = new TicTacToeClient(env);
if(TicTacToeGame::games.empty())
TicTacToeGame::games.push_back(new TicTacToeGame(client));
else
TicTacToeGame::games[0]->join(client);
return client;
}

int main(int argc, char **argv)
{
return WRun(argc, argv, &createApplication);
}

我使用的是 32 位 Win7,MSVS Express 2012,Wt 是 3.3.2,通过“简单方法”安装 here .

最佳答案

我认为你的问题源于此:

void TicTacToeClient::connectFrom(TicTacToeGame& game){
moveTaken->connect(boost::bind(&TicTacToeGame::updateBoard, &game));
}

您绑定(bind)调用对象 (&game),但该函数有 3 个参数。我不熟悉 Wt,但看起来 moveTaken Signal 将使用适当的参数调用该函数。在这种情况下,您只需将占位符添加到您的 boost::bind 调用中。

moveTaken->connect(boost::bind(&TicTacToeGame::updateBoard, &game, _1, _2, _3));

虽然我不确定这一点,但让我知道结果如何。

关于c++ - 将 boost::bind 成员函数传递给 wt 监听器。我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23692509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com