2016-10-10 31 views
1
#include <functional> 
#include <iostream> 

struct Foo { 
    Foo(int num) : num_(num) {} 
    void print_add(int i) const { std::cout << num_+i << '\n'; } 
    int get_num(int i) { return num_;} 
    void set_num(int i) { num_ = i;} 
    int num_; 
}; 
int main() { 
    std::function<int(const Foo *, int)> f_get_num; 
    f_get_num = &Foo::get_num; 
    return 0; 
} 

這將在行f_get_num = &Foo::get_num處生成一個錯誤error: invalid conversion from ‘const Foo*’ to ‘Foo*’ [-fpermissive]Foo::get_num類型是int (Foo:: *fp)(int)。有人可以解釋嗎?謝謝。const成員函數的std功能包裝

+0

爲什麼你覺得'get_num'有簽名'int(const Foo *,int)'? – NathanOliver

回答

3

您不能在const對象上調用非const函數。您可以通過const Foo*f_get_num,但Foo::get_num需要非常量暗示this

以下兩個調用是隻是爲非法:

Foo foo; 
Foo const* const_ptr = &foo; 

const_ptr->get_num(42); 
f_get_num(const_ptr, 42); // results in const_ptr->get_num(42) 

你可以聲明get_numconst

int get_num(int i) const { return num_;} 

然後你的代碼將正常工作。

另一種方法是使f_get_num參數爲非const參數,但當您的函數是getter並且不應修改該對象時,這不是一種方法。

std::function<int(Foo*, int)> f_get_num; 
f_get_num = &Foo::get_num;