web-dev-qa-db-fra.com

Visual Studio 2015 «syntaxe non standard; utilisez '&' pour créer un pointeur sur un membre ”

J'apprends le C++ et j'essaye de faire un petit jeu de Tic Tac Toe. Mais je continue d’obtenir C3867, syntaxe non standard; utilisez '&' pour créer un pointeur à retenir.

Voici mon TicTacToe.h:

#pragma once
#include <iostream>

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

Et voici mon TicTacToe.cpp:

#include "TicTacToe.h"
#include <iostream>
#include <string>

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 << "Enter your name, player 1: \n";
  cin >> player1Name;
  _player1Name = player1Name;
}

void TicTacToe::setName2(string player2Name) {
  cout << "Enter your name, player 2: \n";
  cin >> player2Name;
  _player2Name = player2Name;
}

string TicTacToe::getName1() { return _player1Name; }

string TicTacToe::getName2() { return _player2Name; }

void TicTacToe::setSign1(string player1Sign) {
  cout << "What will you sign be?(X/O)\n";
  cin >> player1Sign;
  if (player1Sign != "X" && player1Sign != "O" && player1Sign != "x" &&
      player1Sign != "o") {
    cout << "Invalid input, try again.\n";
    cin >> player1Sign;
  }
  _player1Sign = player1Sign;
}

void TicTacToe::setSign2(string player2Sign, string player1Sign) {
  cout << "What will you sign be?(X/O)\n";
  cin >> player2Sign;

  if (player2Sign != "X" && player2Sign != "O" && player2Sign != "x" &&
          player2Sign != "o" ||
      player2Sign == player1Sign) {
    cout << "Invalid input, try again.\n";
    cin >> player2Sign;
  }
  _player2Sign = player2Sign;
}

void TicTacToe::player1Move(string coordX) // ERROR
{
  cout << "Enter X: " << endl;
  cin >> 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;
}

J'ai tout essayé dans d'autres questions à propos de cette erreur mais cela n'a pas fonctionné. Comment corrigez-vous cette erreur?

17
T. Long

Le problème est avec les lignes qui contiennent ce qui suit (il apparaît deux fois dans votre code):

Board.player1Move;

Le joueur un coup est une fonction qui reçoit un paramètre std :: string en tant qu'entrée. Pour l'appeler, vous devez créer un objet std :: string et le transmettre en tant qu'argument de la fonction. Vous pouvez utiliser la syntaxe suivante si vous souhaitez que la chaîne soit donnée en entrée:

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

Notez également que player2Turn doit appeler Board.player2Move au lieu de Board.player1Move.

10
drorco

Le correctif de votre problème est déjà fourni dans le réponse de drorco . Je vais essayer d'expliquer le message d'erreur.

Lorsque vous avez une fonction non membre, vous pouvez utiliser le nom de la fonction dans une expression sans utiliser la syntaxe d'appel de fonction.

void foo()
{
}

foo; // Evaluates to a function pointer.

Toutefois, lorsque vous avez une fonction membre, l'utilisation du nom de la fonction membre dans une expression sans la syntaxe d'appel de fonction n'est pas valide.

struct Bar
{
   void baz() {}
};

Bar::baz;  // Not valid.

Pour obtenir un pointeur sur une fonction membre, vous devez utiliser le & _ opérateur.

&Bar::baz;   // Valid

Cela explique le message d'erreur de Visual Studio:

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

J'obtenais ceci quand j'ajoutai rapidement std::exception vers une application pour try/catch blocs de code, comme ceci:

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

Je devais juste changer le paramètre pour que le nom de l'exception commence par &, ainsi:

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