2012-10-27 5 views
10

here에서 가져온 다음 코드를 컴파일하려고하는데 컴파일 오류가 발생합니다. 누구든지 잘못된 아이디어가 있습니까?std :: function이 VS2012에서 컴파일되지 않습니다.

코드

#include <iostream> 
#include <functional> 

struct Foo { 
    Foo(int num) : num_(num) {} 
    void print_add(int i) const { std::cout << num_+i << '\n'; } 
    int num_; 
}; 


int main() 
{ 
    // store a call to a member function 
    std::function<void(const Foo&, int)> f_add_display = &Foo::print_add; 
    Foo foo(314159); 
    f_add_display(foo, 1); 
} 

컴파일 오류 :

Error 1 error C2664: 'std::_Func_class<_Ret,_V0_t,_V1_t>::_Set' : 
cannot convert parameter 1 from '_Myimpl *' to 'std::_Func_base<_Rx,_V0_t,_V1_t> *' 

감사합니다.

+1

사용하는 Xeo의 제안에 따라 편집 한 다음 작품은 지금

print_add'는 두 개의 인수를가', 그것이 _implicit_을'이를 this' 타입'Foo const *'의 인수도. –

+0

@ K-ballo 오른쪽, 죄송합니다. – jogojapan

+0

@ K-ballo :'std :: function'은 첫 번째 매개 변수 유형이 멤버의 클래스 유형에 대한 (참조/포인터) 클래스 인 경우 자동으로'std :: mem_fn'을 사용합니다. – Xeo

답변

7

이것은 VS2012의 버그처럼 보입니다. 버그 리포트 here을 만들었습니다.

편집 : 표준 : : mem_fn을 @jogojapan

#include <iostream> 
#include <functional> 

struct Foo { 
    Foo(int num) : num_(num) {} 
    void print_add(int i) const { std::cout << num_+i << '\n'; } 
    int num_; 
}; 

int main() 
{ 
    // store a call to a member function 
    std::function<void(const Foo&, int)> f_add_display = std::mem_fn(&Foo::print_add); 
    Foo foo(314159); 
    f_add_display(foo, 1); 
} 
+2

코드가 다소 이상합니다. 당신은'foo'를 묶고 여전히'std :: function '를 가지고 있습니다. 이것이 작동하는 유일한 이유는'std :: bind'가 불필요한 인수를 버리기 때문입니다. 질문에서 당신이 시도하는 것과 똑같은 것은'std :: mem_fn (& Foo :: print_add)'를 사용하는 것입니다. – Xeo

+0

@Xeo std :: bind와 std :: mem_fn은 언제 사용해야합니까? std :: mem_fn이 더 단순 해 보입니다. –

+0

'std :: mem_fn'은 멤버 포인터에 대한 간단한 래퍼로서 클래스의 포인터 또는 참조를 첫 번째 매개 변수로 사용하는 함수 객체를 반환하며 그 이후의 멤버 함수 (있는 경우)의 모든 매개 변수를 반환합니다. 'std :: bind'는 함수에 인자를 바인딩하기위한 것입니다. – Xeo

관련 문제