【问题标题】:pointer to function compilation error指向函数编译错误的指针
【发布时间】:2017-06-03 04:03:54
【问题描述】:

我正在尝试使用上面指向函数的指针调用该函数,但它一直显示此错误:明显调用括号前的表达式必须具有 (pointer-to-) 函数类型。有什么帮助吗?

    #include<iostream>
using namespace std;
class a
{
public:
    a(){}
    int f(float m){cout<<"called.\n";return 1;}
};

int main()
{
    int (a::*ptr2)(float m) = &a::f;
    a *p ,obj;
    p = &obj;
    obj.*ptr2(.8);
    p->*ptr2(.5);
}

【问题讨论】:

  • 试试(obj.*ptr2)(.8);和(p-&gt;*ptr2)(.5);。
  • 此代码不使用指向函数的指针。它使用一个指向成员函数的指针。它们是完全不同的两件事。

标签: c++


【解决方案1】:

您只是在函数指针调用周围缺少一些括号。

#include<iostream>

class a
{
public:
    a(){}
    int f(float m) {
        std::cout<<"called."<<std::endl;
        return 1;
    }
};

int main()
{
    int (a::*ptr2)(float m) = &a::f;
    a *p ,obj;
    p = &obj;
    (obj.*ptr2)(.8); //note the difference
    (p->*ptr2)(.5);
}

在这种情况下,std::invoke 可以非常方便: std::invoke Reference

【讨论】:

  • +1,但std::function 不适合这种情况,这是不必要的开销。这不需要类型擦除,如果您希望在语法上令人愉悦en.cppreference.com/w/cpp/utility/functional/invoke 是一种不涉及虚拟调度的选项
  • @Curious 没有异议,尽管我认为在像这个这样简单的示例中,差异可以忽略不计。但就长期最佳实践而言,您是正确的。
  • 编辑您的答案以反映这一点!不想让 OP 走错路..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
相关资源
最近更新 更多