瑶池酒剑仙 2022-11-28 12:58 采纳率: 100%
浏览 78
已结题

error C3867:非标准语法;请使用“&”来创建指向成员的指针

类成员函数作为函数参数出现error C3867:非标准语法;请使用“&”来创建指向成员的指针

有的时候一个泛函可能会采用函数或函数对象(functor)做参数,这时候我们可能想要使用类的成员函数来做参数,但是这时候会出现error C3867: 非标准语法;请使用 "&" 来创建指向成员的指针,比如下面例子:

using namespace std;
class TestC
{
private:
     double a, b;
public:
     TestC(double a_,double b_):a(a_),b(b_){}
    double testFun(double x);
};
template<class Func>
double testTemplateFun(double input, Func proccess)
{
     return proccess(input);
}
int main()
{
     double a = 10;
     TestC t(2, 3);
     cout << "输出结果为:" << testTemplateFun(a, t.testFun);
     system("pause");
     return 0;
}
double TestC::testFun(double x)
{
     return a*x + b;
}


  • 写回答

2条回答 默认 最新

  • 瑶池酒剑仙 2022-11-28 13:18
    关注

    深入分析:这时候我们按照提示将t.testFun前面加上&又会出现error C2276: “&”: 绑定成员函数表达式上的非法操作,那么这到底是什么错误?

    其实这里是因为类的成员函数默认带有一个this指针参数,那么它作为泛函的参数其实就不匹配了,因为泛函中的Func类型并没有this指针,所以我们可以把TestC类中的testFun(double x)函数声明为静态(static)的,这样就不带有this指针;但是静态的函数又不能访问非静态的成员,像这里TestC的testFun函数访问了非静态的成员变量a,b,就会出错,那要怎么办?
    解决方案:这里其实就是相当于泛函中要求单参函数,而使用的是双参函数,可以自己定义一个适配类,适配双参函数为单参,如下例:

    #include <iostream>
    using namespace std;
    class TestC
    {
    private:
         double a, b;
    public:
         TestC(double a_,double b_):a(a_),b(b_){}
         double testFun(double x);
    };
    template<class Func>
    double testTemplateFun(double input, Func proccess)
    {
         return proccess(input);
    }
    class TestCAdapter
    {
    private:
         TestC *t;
    public:
         TestCAdapter(TestC *t_):t(t_){}
         double operator()(double x);
    };
    int main()
    {
         double a = 10;
         TestC t(2, 3);
         //cout << "输出结果为:" << testTemplateFun(a, t.testFun) << endl;
         TestCAdapter ad(&t);
         cout << "输出结果为:" << testTemplateFun(a, ad) << endl;
         system("pause");
         return 0;
    }
    double TestC::testFun(double x)
    {
         return a*x + b;
    }
    double TestCAdapter::operator()(double x)
    {     
           return t->testFun(x);
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月6日
  • 已采纳回答 11月28日
  • 修改了问题 11月28日
  • 创建了问题 11月28日

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?