2016-10-10 3 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_numerror: invalid conversion from ‘const Foo*’ to ‘Foo*’ [-fpermissive] 오류가 발생합니다. Foo::get_num 유형은 int (Foo:: *fp)(int)입니다. 아무도 그것을 설명 할 수 있습니까? 감사.std const 멤버의 함수 래퍼

+0

왜'get_num'에 'int (const Foo *, int)'라는 서명이 있다고 생각합니까? – NathanOliver

답변

3

const 개체에는 const이 아닌 함수를 호출 할 수 없습니다. const Foo*f_get_num으로 전달할 수 있지만 Foo::get_num은 비 const 내재적 인 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으로 설정하는 것입니다.하지만이 방법은 가져 오기 기능이고 객체를 수정해서는 안됩니다.

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