Visual Studio 2015 „nicht standardmäßige Syntax; Verwenden Sie ‘&’, um einen Zeiger auf das Mitglied zu erstellen.

Lesezeit: 5 Minuten

Visual Studio 2015 „nicht standardmasige Syntax Verwenden Sie um
T. Lang

Ich lerne C++ und versuche, ein kleines Tic Tac Toe-Spiel zu machen. Aber ich bekomme immer wieder C3867, nicht standardmäßige Syntax; Verwenden Sie ‘&’, um einen Zeiger zu erstellen, an den Sie sich erinnern können.

Dies ist meine 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;
};

Und hier ist meine 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;
}

Ich habe alles in anderen Fragen zu diesem Fehler versucht, aber sie haben nicht funktioniert. Wie beheben Sie diesen Fehler?

  • Bitte erstellen Sie ein reproduzierbares Minimalbeispiel. Betonung auf minimal.

    – Barri

    14. Juni 2016 um 15:05 Uhr

  • Sie müssen die Linie kennzeichnen, die das Problem verursacht, um unser Leben ein bisschen einfacher zu machen!

    – Sean

    14. Juni 2016 um 15:05 Uhr

  • Du sagst Board.player1Move wenn Sie es als Funktion aufrufen sollen. Außerdem wird ein Parameter (eine Zeichenfolge) verwendet, den Sie nicht übergeben.

    – Sean

    14. Juni 2016 um 15:08 Uhr

  • Warum plötzlicher Zustrom von TicTacToe-Spielen im C++-Tag? Es ist nicht einmal ein interessantes Spiel!

    – SergejA

    14. Juni 2016 um 15:19 Uhr

  • Tut mir leid, wenn ich hier zum ersten Mal eine Frage stelle, werde ich daran denken. Danke für die Antwort.

    – T. Lange

    14. Juni 2016 um 15:19 Uhr

1646241609 429 Visual Studio 2015 „nicht standardmasige Syntax Verwenden Sie um
R Sahu

Die Lösung für Ihr Problem ist bereits in der Antwort von drorco enthalten. Ich versuche mal die Fehlermeldung zu erklären.

Wenn Sie eine Nicht-Member-Funktion haben, können Sie den Funktionsnamen in einem Ausdruck verwenden, ohne die Funktionsaufrufsyntax zu verwenden.

void foo()
{
}

foo; // Evaluates to a function pointer.

Wenn Sie jedoch über eine Memberfunktion verfügen, ist die Verwendung des Memberfunktionsnamens in einem Ausdruck ohne die Funktionsaufrufsyntax nicht gültig.

struct Bar
{
   void baz() {}
};

Bar::baz;  // Not valid.

Um einen Zeiger auf eine Member-Funktion zu erhalten, müssen Sie die verwenden & Operator.

&Bar::baz;   // Valid

Das erklärt die Fehlermeldung von Visual Studio:

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

  • Dies war die nützliche Antwort in meinem Fall, da ich so etwas ersetzen musste functionToUse = baz; mit sowas functionToUse = &Bar::baz; als eine Software, die ich pflege, nicht mehr kompiliert werden konnte. Die functionToUse Variable wurde eine Funktion für 8-Bit-Grafiken oder eine andere Funktion für 24-Bit-Farbgrafiken zugewiesen.

    – Iwan

    21. Mai 2019 um 15:55 Uhr


  • Überraschenderweise funktioniert das obige nicht, wenn dem Klassennamen nicht der Bereichsauflösungsoperator vorangestellt ist, dh nur &baz ist illegal.

    – Sisir

    6. September 2019 um 19:37 Uhr

Das Problem liegt bei den Zeilen, die Folgendes enthalten (es erscheint zweimal in Ihrem Code):

Board.player1Move;

Player one move ist eine Funktion, die einen std::string-Parameter als Eingabe erhält. Um es aufzurufen, müssen Sie ein std::string-Objekt erstellen und es als Argument für die Funktion übergeben. Sie können die folgende Syntax verwenden, wenn Sie möchten, dass die Zeichenfolge als Eingabe angegeben wird:

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

Beachten Sie auch, dass player2Turn Board.player2Move anstelle von Board.player1Move aufrufen sollte.

Ich habe das bekommen, als ich schnell hinzugefügt habe std::exception zu einer App für try/catch Codeblöcke, etwa so:

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

Ich musste nur den Parameter für den Namen der Ausnahme ändern, um damit zu beginnen &so:

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

914370cookie-checkVisual Studio 2015 „nicht standardmäßige Syntax; Verwenden Sie ‘&’, um einen Zeiger auf das Mitglied zu erstellen.

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy