【问题标题】:VS2017 "non-standard syntax; use '&' to create a pointer to member " [closed]VS2017“非标准语法;使用 '&' 创建指向成员的指针” [关闭]
【发布时间】:2017-10-04 16:57:11
【问题描述】:
class DefInt
{
private:
    double a;
    double b;
    double (*f)(double x);
    int N;
public:
    DefInt(double c, double d, double (*g)(double y))
    {
        a = c;
        b = d;
        f = g;
    }

    double BySimpson()
    {
        double sum = f(a) + 4 * f((a + b) / 2) + f(b);
        return sum * (b - a) / 3;
    }

};
double g(double y)
{
    double sum = 1 - y * y + y * y * y;
    return sum;
}
int main()
{
    int c = 1;
    int d = 2;
    double y;
    DefInt MyInt(c, d, g);
    cout << "BySimpson:" << MyInt.BySimpson << endl << endl;
    system("pause");
    return 0;
}

为什么会有错误提示'DefInt::BySimpson': non-standard syntax;使用“&”创建指向成员的指针? 顺便说一句,我省略了一个类似的 DefInt 成员函数,虽然它与 Bysimpson 几乎相同,但它工作正常并且没有发生错误。我不明白为什么。 我已经把它贴在这里了。

double ByTrapzold(int n)
{
    N = n;
    double sum = f(a + (b - a) / N);
    for (int i = 2; i <= N; i++)
    {
        sum = sum + 2 * f(a + (b - a) * i / N);
    }
    sum = sum + f(a + (b - a) * (N + 1) / N);
    return sum * (b - a) / (2 * N);
}

谢谢。

【问题讨论】:

  • 您缺少一组()cout &lt;&lt; "BySimpson:" &lt;&lt; MyInt.BySimpson &lt;&lt; endl &lt;&lt; endl; 应该是 cout &lt;&lt; "BySimpson:" &lt;&lt; MyInt.BySimpson() &lt;&lt; endl &lt;&lt; endl;
  • 谢谢。我刚开始学习,我认为如果不需要变量,可以不放 ()。
  • @YimengMa 你为什么会这么想? Read a good book on C++ 而不是试图通过随机编码来学习。
  • 其实我正在上一门课程,这是一个家庭作业。我知道这个问题很愚蠢,但我不能删除它,因为它已经得到了回答。我现在怎样才能删除它?我的意思是我明白它对其他人没有帮助,我不希望它出现在我的主页上。
  • @YimengMa 1) 如果是你的作业,源材料应该已经向你解释过,所以你应该已经知道答案。 2)你不能。除非回答您的问题的人将其删除,否则您的问题又回到未回答状态。

标签: c++ visual-studio


【解决方案1】:

上线

cout << "BySimpson:" << MyInt.BySimpson << endl << endl;

您可能打算给 BySimpson 打电话,但您忘记了 ()

cout << "BySimpson:" << MyInt.BySimpson() << endl << endl;

你得到这个误导性错误的原因是因为预 ISO 标准化 MyInt.BySimpson 实际上意味着你想要地址,就像普通函数一样,函数名本身就给出了函数的地址。然而,后来使用 & 来获取成员的地址作为要求被放入标准中。所以 Visual Studio 认为您仍在使用旧语法,并希望您使用新语法。

【讨论】:

  • 请不要回答错字问题。我们对他们有密切的投票理由。
  • 谢谢。我刚开始学习,我认为如果不需要变量,可以不放 ()。
  • MyInt.BySimpson never 表示你想要函数的地址,除非是微软的想象。它从来不是语言的一部分。微软非正式地发布了一份文件,建议标准委员会认可他们编译器的错误;这篇论文得到了一个累积的耸耸肩,然后很快就消失了。
猜你喜欢
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
相关资源
最近更新 更多