2014-04-18 3 views
3
class animal { 
protected: 
    animal() {} 
    void eat(int x) {} 
}; 


class human 
    : private animal 
{ 
public: 
    typedef animal base_type; 
    using base_type::eat; 
}; 

class stomach { 
public: 
    stomach(std::function<void(int)> feed) {} 
}; 

class lady 
    : public human 
{ 
public: 
    typedef lady  this_type; 
    typedef human  base_type; 

    lady() 
     : base_type() 
     , m_Stomach(std::bind(&base_type::eat, this, std::placeholders::_1)) 
    { 
    } 

private: 
    stomach m_Stomach; 
}; 

클라이언트 코드가 적어 경우 :이 상황에서 기본 클래스의 메서드를 std : : bind 할 수 있습니까?

lady gaga; 

컴파일러는 std::bind(&base_type::eat, ...)오류 C2064 것을 불평 : 기간은 2 개 인자을 복용 함수에 평가하지 않습니다. 도움말 기능으로

class lady 
    : public human 
{ 
public: 
    typedef lady  this_type; 
    typedef human  base_type; 

    lady() 
     : base_type() 
     , m_Stomach(std::bind(&this_type::help_eat, this, std::placeholders::_1)) 
    { 
    } 

private: 
    void help_eat(int x) 
    { 
     base_type::eat(x); 
    } 
    stomach m_Stomach; 
}; 

, 컴파일러 것이다 std::bind 잘 :

그 클래스 아가씨가 변경되었을 경우 발견했다. 그러나 코드는 중복됩니다.

또한 std::bind을 람다 m_Stomach([&](int x){ base_type::eat(x); })으로 변경하면 컴파일 된 것으로 나타났습니다.

내 질문에이 상황에서 std::bind을 사용하는 더 좋은 방법이 있습니까? 그렇지 않다면 나는 아마도 람다를 고려할 것입니다.

답변

2

내 문제가 animalanimal에서 메소드를 호출 할 수 없습니다 (lady* 형이다) 따라서 전용human베이스 클래스 및 전달 (및 저장) this 점이다.

animal* animal_ptr() { return this; } 

나중에 바인딩 :

std::bind(&base_type::eat, animal_ptr(), std::placeholders::_1) 

Live example

+0

죄송하지만 [라이브 예제] (http://coliru.stacked-crooked.com/a/86aa3493784bdb9a)는 광산 (VS2012) 용으로 컴파일 할 수 없습니다. 내가 놓친 게 있니? – cbel

+0

@cbel : 저는 VS/Windows를 사용하지 않습니다. 죄송합니다. 정확한 오류 메시지는 무엇입니까? –

+0

메시지는 이전과 동일합니다 ** 오류 C2064 : 용어는 2 개의 인수를 취하는 함수로 평가되지 않습니다 ** – cbel

0

동물은 인간의 개인 기본 클래스이며, 당신은 그것을 공공 기반 만들거나 human에 메서드를 추가하여 해결할 수 using- 선언을 사용하면 함수를 먹을 수는 있지만 함수의 기호 void (animal::*)(int)은 변경되지 않습니다. 그들은 구성원 것처럼 7.3.3 과부하 해결하기위한 목적으로 사용 선언

가입일

는 파생 클래스로 사용 선언 도입 이다 기능은 처리한다 파생 클래스. 특히 암시 적으로이 매개 변수는 기본 클래스가 아닌 파생 클래스 에 대한 포인터 인 것처럼 처리해야합니다. 이것은 에 함수의 유형을 적용하지 않으며 다른 모든 측면에서는 함수는 기본 클래스의 멤버로 남아 있습니다.

따라서 바인딩 (함수 유형 참조)은 오류 ‘animal’ is an inaccessible base of ‘lady’ (g ++)이됩니다.

람다 m_Stomach([this](int x) { this->eat(x); }), 을 사용하여 사람의 사용 선언을 void eat(int x) { base_type::eat(x); }으로 바꾸거나 그냥 사용하십시오.

+0

나는 두려워요. 저자는 여기서 VS 컴파일러가 아닌 다른 컴파일러 오류와 혼동합니다. 여기에서 다루는 문제는 이미 논의되었습니다 (예 : http://stackoverflow.com/questions/19340190/c-boostbind-says-inaccessible). -base-class – Ixanezis

+0

@Ixanezis C2064 오류는 오해의 소지가 있다고 생각합니다. –

관련 문제