Странно - мой локальный компилятор (CYGWIN 6.4.0) позволяет это, но Godbolt - нет. Хорошо, я уберу второй вариант и перефразирую. РЕДАКТИРОВАТЬ: это опция -fpermissive, которая позволяет это.

лкнулся с этой ошибкой (ошибка C3867: нестандартный синтаксис; используйте '&' для создания указателя на член) пару раз. Я знаю, что этот вопрос задавался много раз, но я не понимаю, почему проблема возникает и что я могу сделать, чтобы ее исправить. Я прочитал много руководств, как работают указатели, и я пытался поиграть с новыми знаниями, но я не знаю, как это сделать правильно.

Для этого вопроса я сделал простой код. Может кто-нибудь помочь мне понять, почему возникает эта ошибка и как исправить этот код?

Ошибка: ошибка C3867: «BankAccount :: amountOfMoney»: нестандартный синтаксис; используйте '&', чтобы создать указатель на член

Source.cpp

#include <iostream>
#include <string>

#include "BankAccount.h"

using namespace std;

int main(){

    BankAccount bankAccount1("testName", 200.0);

    cout << bankAccount1.amountOfMoney << endl;

}

BankAccount.h

#pragma once
#include <string>

using namespace std;

class BankAccount
{
public:
    BankAccount();
    BankAccount(string name, double money);
    ~BankAccount();
    double amountOfMoney();

private:
    string name;
    double money;
};

BankAccount.cpp

#include "BankAccount.h"


BankAccount::BankAccount()
{
}

BankAccount::BankAccount(string n, double m) {
    name = n;
}

BankAccount::~BankAccount()
{
}

double BankAccount::amountOfMoney() {
    return money;
}
 user46303581820 окт. 2017 г., 10:54
вам нужно проверить, как вызывать метод
 Bo Persson20 окт. 2017 г., 10:54
amountOfMoneyэто функция, поэтому вы должны использовать() называть это В противном случае компилятор думает, что вы хотитеадрес функции.cout << bankAccount1.amountOfMoney() << endl;

Ответы на вопрос(2)

Если вы хотите вызвать функцию-член, используйте скобки .:

cout << bankAccount1.amountOfMoney() << endl;
 Arrrow20 окт. 2017 г., 11:23
Второй вариант будет просто печатать «1», учитывая, что синтаксис будет изменен на&BankAccount::amountOfMoney
 Martin Bonner20 окт. 2017 г., 11:05
Второй вариантнеправильно, Вы не можете получить простой указатель наamountOfMoney, Это функция-член, и вы не можете сгенерировать простой указатель на функцию-член. Вы можете сгенерировать "функцию указателя на член"но это не указатель (и синтаксис&BankAccount::amountOfMoney).
 IanM_Matrix120 окт. 2017 г., 11:26
Странно - мой локальный компилятор (CYGWIN 6.4.0) позволяет это, но Godbolt - нет. Хорошо, я уберу второй вариант и перефразирую. РЕДАКТИРОВАТЬ: это опция -fpermissive, которая позволяет это.
 Jabberwocky20 окт. 2017 г., 11:18
Я бы удалил этот ответ, прежде чем он будет опущен.
Решение Вопроса

Вы забыли оператор вызова функции(), Измени свойmain код для:

int main(){

    BankAccount bankAccount1("testName", 200.0);

    cout << bankAccount1.amountOfMoney() << endl;

}

Без скобок он пытается напечатать адрес функции-члена, что он не может сделать, если функция не является членом класса.

 Arrrow20 окт. 2017 г., 14:22
@Kasper Он сделал именно то, что вы описываете: вернуть значениеmoney, Вы никогда не инициализировали double, поэтому он получит «неинициализированное» значение, которое (по крайней мере, в Windows) обычно выглядит0xCCCC CCCC CCCC CCCD (64 бита). Следовательно-9.25596e+61.
 user792408220 окт. 2017 г., 12:09
Это вывод, когда я пытаюсь сделать это "-9.25596e + 61". Разве это не должно вернуть значение двойных «денег» вместо этого?
 Bo Persson20 окт. 2017 г., 12:34
@Kasper - Так какова ценностьmoney? Вы не устанавливаете значение в конструкторе ...(И кстати, от парня, работающего в банке, когда вы открываете новый счет, на нем никогда не бывает денег. Вы должны сделать депозит. :-)
 user792408223 окт. 2017 г., 09:48
Ах, конечно! Я полностью забыл установить значение из конструктора. Спасибо всем вам, ребята, за объяснение, как это работает :)

Ваш ответ на вопрос