我正在尝试调用一个函数。这些愚蠢的编译错误的原因是啥?

Posted

技术标签:

【中文标题】我正在尝试调用一个函数。这些愚蠢的编译错误的原因是啥?【英文标题】:I'm trying to call a function. What is the cause of these silly compilation errors?我正在尝试调用一个函数。这些愚蠢的编译错误的原因是什么? 【发布时间】:2012-01-13 21:56:53 【问题描述】:

我正在尝试运行我编写的这个 c++ 程序。我在 Visual C++ 中遇到以下错误:

1>c:\users\server\desktop\problem7\problem7\main.cpp(26) : 错误 C3867: 'Payment::getamount': 函数调用缺少参数列表;使用 '&Payment::getamount' 创建指向成员的指针

1>c:\users\server\desktop\problem7\problem7\main.cpp(74) : 错误 C3867: 'cashPayment::paymentDetails': 函数调用缺少参数列表;使用 '&cashPayment::paymentDetails' 创建指向成员的指针

1>c:\users\server\desktop\problem7\problem7\main.cpp(75) : 错误 C3867: 'CreditCardPayment::paymentDetails': 函数调用缺少参数列表;使用 '&CreditCardPayment::paymentDetails' 创建指向成员的指针

代码是:

#include <iostream>
#include <cstring>
using namespace std;

class Payment

private: float amount;

public: Payment(float=0.0);
        void paymentDetails();
        float getamount();
        void setamount(float);
;


Payment::Payment(float a)

    setamount(a);


void Payment::setamount(float a)amount=a;
float Payment::getamount()return amount;

void Payment::paymentDetails()

    cout<<"The amount of payment is : "<<getamount<<"$"<<endl;


class cashPayment: public Payment

public: cashPayment(float=0.0);
        void paymentDetails();
;
cashPayment::cashPayment(float a):Payment(a);
void cashPayment::paymentDetails()

    cout<<"The payment in cash is : "<<getamount()<<"$"<<endl;


class CreditCardPayment: public Payment

private: char* name;
         int creditnumber;
         int day,month,year;

public: CreditCardPayment(char[]=" ",int=0, int=0, int=0, int=0 ,float=0.0);
        void paymentDetails();
;

CreditCardPayment::CreditCardPayment(char* n, int cn, int d, int m, int y, float a):Payment(a)

    int l=strlen(n);
    name = new char[l+1];
    strncpy(name,n,l);
    name[l]='\0';
    creditnumber=cn;
    day=d;
    month=m;
    year=y;

void CreditCardPayment::paymentDetails()

    cout<<"Credit Card Holder Information & Payment: "<<endl;
    cout<<"Name is "<<name<<endl;
    cout<<"Credit Number is "<<creditnumber<<endl;
    cout<<"Expiration Date (Day / Month / Year) is "<<day<<"/"<<month<<"/"<<year<<endl;
    //cout<<"Payment is "<<Payment::getamount()<<"$"<<endl;


int main()

    CreditCardPayment cc1("Mohammad",936623,21,9,2011,3000);
    cashPayment cp1(4500);
    cp1.paymentDetails;
    cc1.paymentDetails;

    system("pause");
    return 0;

【问题讨论】:

你想买一些括号吗? cp1.paymentDetails => cp1.paymentDetails(). 首先,您应该指出代码中的哪些行(带有 cmets)是产生错误的行,以便人们可以轻松找到它们。 @KenWhite:公平地说,编译错误有行号,只有几行错误有意义。 @CharlesBailey,真的。但是海报具有编译器正在标记的确切行位置(并且可以在此处发布之前在代码编辑器中找到并标记它们),并且标记它们使需要扫描的内容更清楚以找到原因。您必须阅读的代码越少,您就能越快发现问题并提供答案,提问者就越快恢复工作。 :) 而且我没有否决这个问题 - 我向提出问题的人提出了一个建议,以帮助那些试图帮助他/她的人。 【参考方案1】:

在这里:

void Payment::paymentDetails()

    cout<<"The amount of payment is : "<<getamount<<"$"<<endl;

编译器告诉您,您的意思可能是 getamount() 而不是 getamount

这里也一样:

cp1.paymentDetails;
cc1.paymentDetails;

你的意思可能是:

cp1.paymentDetails();
cc1.paymentDetails();

与其他一些语言不同,在 C++ 中,当您调用不带参数的函数时,您仍然必须在括号中提供一个空参数列表。

【讨论】:

【参考方案2】:
cp1.paymentDetails;
cc1.paymentDetails;

错误状态为“函数调用缺少参数列表”。您的函数调用确实缺少参数列表。你需要使用()来调用函数:

cp1.paymentDetails();
cc1.paymentDetails();

错误的后半部分,读作“'&Payment::getamount' to create a pointer to member”是一个“有用的”提示,如果您打算获取函数的地址,则需要使用一元&amp;(地址)运算符。

有这个提示是因为在计算非成员函数的地址时不需要运算符(为了与 C 和遗留代码兼容),但在计算一个非静态成员函数。

【讨论】:

以上是关于我正在尝试调用一个函数。这些愚蠢的编译错误的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

函数调用时的 C 到 C++ 错误

尝试通过单击按钮调用子程序并收到编译错误:未定义子或函数

“被调用的对象'int'不是函数或函数指针”错误

PHP多个对象函数调用

在Android环境下编译调用c++出现以下错误,大神们这是啥原因呀??我已经配置NDK了。

紧急求助!ARM-GCC对于函数指针调用的编译有错误?已经找到原因