2017-06-03 81 views
1

我試圖調用函數使用上面的函數指針,但它一直顯示此錯誤:表觀函數類型之前的表達式必須具有(指針 - )函數類型的括號。任何幫助?函數編譯錯誤指針

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

嘗試'(OBJ * PTR2)(8);'和'(對 - > * PTR2)(5 );'。 – songyuanyao

+0

此代碼**不使用指向函數**的指針。它使用**指向成員函數**。他們是兩個完全不同的東西。 –

回答

2

你簡直想念你的函數指針調用的一些括號。

#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

+0

+1,但'std :: function'不適合這樣的情況,這是不必要的開銷。這不需要類型擦除,如果你正在尋找這種語法愉悅http://en.cppreference.com/w/cpp/utility/functional/invoke是一個不涉及虛擬調度的選項 – Curious

+0

@Curious沒有不同意見儘管我認爲在一個像這樣簡單的例子中,差異是微不足道的。但就長期的最佳實踐而言,你是正確的。 –

+0

編輯你的答案反映!不想讓OP踩錯路.. – Curious