日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

类成员函数作为函数参数/回调函数 出现error C3867

發布時間:2025/4/16 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 类成员函数作为函数参数/回调函数 出现error C3867 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:https://blog.csdn.net/liyunxin_c_language/article/details/83188176

?

類成員函數作為函數參數出現error C3867:非標準語法;請使用“&”來創建指向成員的指針

2018年10月19日 21:17:40?liyunxin_c_language?閱讀數:2097

有的時候一個泛函可能會采用函數或函數對象(functor)做參數,這時候我們可能想要使用類的成員函數來做參數,但是這時候會出現error C3867: 非標準語法;請使用 "&" 來創建指向成員的指針,比如下面例子:

?

  • #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);
  • }
  • 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;
  • }

  • 這時候我們按照提示將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);
  • }
  • 轉載于:https://www.cnblogs.com/damoying/p/10683244.html

    總結

    以上是生活随笔為你收集整理的类成员函数作为函数参数/回调函数 出现error C3867的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。