Visual Studio 2015 “syntax non standard; usa “&” per creare un puntatore al membro “

Sto imparando C ++ e provo a fare un piccolo gioco di Tic Tac Toe. Ma continuo a ottenere C3867, syntax non standard; usa ‘&’ per creare un puntatore da ricordare.

Questo è il mio TicTacToe.h:

#pragma once #include  using namespace std; class TicTacToe { public: TicTacToe(); string getName1(); string getName2(); void printBoard(); void clearBoard(); void setName1(string player1Name); void setName2(string player2Name); void setSign1(string player1Sign); void setSign2(string player2Sign, string player1Sign); void playGame(string player1Name, string player2Name,string player1Sign,string player2Sign); void player1Move(string coordX); void player1Turn(); void player2Turn(); private: char Board[3][3]; string _player1Name; string _player2Name; string _player1Sign; string _player2Sign; string _coordX; string _coordY; }; 

Ed ecco il mio TicTacToe.cpp:

 #include "TicTacToe.h" #include  #include  TicTacToe::TicTacToe() {} void TicTacToe::playGame(string player1Name, string player2Name, string player1Sign, string player2Sign) { TicTacToe Board; Board.setName1(player1Name); Board.setSign1(player1Sign); Board.setName2(player2Name); Board.setSign2(player1Sign, player2Sign); Board.clearBoard(); Board.printBoard(); } void TicTacToe::printBoard() { cout << " |1|2|3|\n"; for (int i = 0; i < 3; i++) { cout << "--------\n"; cout << i + 1 << "|" << Board[i][0] << "|" << Board[i][1] << "|" << Board[i][2] << "|" << endl; } } void TicTacToe::clearBoard() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { Board[i][j] = ' '; } } } void TicTacToe::setName1(string player1Name) { cout <> player1Name; _player1Name = player1Name; } void TicTacToe::setName2(string player2Name) { cout <> player2Name; _player2Name = player2Name; } string TicTacToe::getName1() { return _player1Name; } string TicTacToe::getName2() { return _player2Name; } void TicTacToe::setSign1(string player1Sign) { cout <> player1Sign; if (player1Sign != "X" && player1Sign != "O" && player1Sign != "x" && player1Sign != "o") { cout <> player1Sign; } _player1Sign = player1Sign; } void TicTacToe::setSign2(string player2Sign, string player1Sign) { cout <> player2Sign; if (player2Sign != "X" && player2Sign != "O" && player2Sign != "x" && player2Sign != "o" || player2Sign == player1Sign) { cout <> player2Sign; } _player2Sign = player2Sign; } void TicTacToe::player1Move(string coordX) // ERROR { cout << "Enter X: " <> coordX; _coordX = coordX; } void TicTacToe::player1Turn() { cout << "Player 1 turn !\n"; TicTacToe Board; Board.player1Move; } void TicTacToe::player2Turn() { cout << "Player 2 turn !\n"; TicTacToe Board; Board.player1Move; } 

Ho provato tutto in altre domande su questo errore ma non hanno funzionato. Come risolvi questo errore?

Il problema è con le linee che contengono quanto segue (appare due volte nel tuo codice):

 Board.player1Move; 

Player one move è una funzione che riceve un parametro std :: string come input. Per chiamarlo dovrai creare un object std :: string e passarlo come argomento per la funzione. È ansible utilizzare la seguente syntax se si desidera che la stringa venga fornita come input:

 std::string move; cin >> move; Board.player1Move(move); 

Inoltre, nota che player2Turn dovrebbe chiamare Board.player2Move invece di Board.player1Move.

La soluzione al tuo problema è già fornita nella risposta da drorco . Ho intenzione di provare a spiegare il messaggio di errore.

Quando si ha una funzione non membro, è ansible utilizzare il nome della funzione in un’espressione senza utilizzare la syntax della chiamata della funzione.

 void foo() { } foo; // Evaluates to a function pointer. 

Tuttavia, quando si ha una funzione membro, l’uso del nome della funzione membro in un’espressione senza la syntax della chiamata della funzione non è valido.

 struct Bar { void baz() {} }; Bar::baz; // Not valid. 

Per ottenere un puntatore a una funzione membro, è necessario utilizzare l’operatore & .

 &Bar::baz; // Valid 

Questo spiega il messaggio di errore di Visual Studio:

 "non-standard syntax; use '&' to create a pointer to member" 

Stavo ricevendo questo quando aggiungo rapidamente std::exception a un’app per try/catch blocchi di codice, come questo:

 try{ //code block }catch(std::exception e){printf("ERROR: %s", e.what()); return -1;} 

Ho solo bisogno di cambiare parametro per il nome dell’eccezione per iniziare con & , in questo modo:

 try{ //code block }catch(std::exception &e){printf("ERROR: %s", e.what()); return -1;}