2014-06-16 1 views
0

사용자가 인스턴스 수준에서 함수의 동작을 수정하고이 인스턴스의 멤버에 계속 액세스 할 수있는 라이브러리를 만들려고합니다. . 이 게시물은 this thread의 연속이며 this one의 연속입니다. Praetorian suggested me std :: function/bind를 사용하여 그렇게합니다. 불행하게도, 나는 두 가지 오류가 있습니다"해결되지 않은 오버로드 된 함수 유형에 대한 호출과 일치하는 함수가 없습니다."

납 # 1 : 오류 : '자식 1 : BindIt()에 대한 호출에 대한 일치하는 기능

납 # 2 : 오류 :'연산자에 대한 어떤 경기 = (const double &), 자식 1 , const std :: _ 자리 표시 자 < 1> &> :: 일급 :: 일명 바인드 (Child1, 피연산자 유형은 'std :: function'및 'std :: _ Bind_helper' std :: _ 자리 표시 자 < 1>)) (const double &)>} ')

이 문제를 해결하는 방법을 모르겠습니다.

#include <iostream> 
#include <vector> 
#include <cstdlib> 
#include <functional> 

using namespace std; 


template<typename T,typename D> T fcn_default(const D &obj, const T &phit){ 
    return 3.2 + phit; 
} 

template<typename T> class Parent{ 
    public: 
     Parent() {} 

     T do_something(const T &phit){ 
      return this->fcn_ptr(phit); 
     } 

     std::function<T(const T&)> fcn_ptr; 

}; 


template<typename T> class Child1 : public Parent<T>{ 
    public: 
     Child1() { 
      BindIt(&fcn_default< T , Child1<T> >); // Pb #1: here 
     } 
     void BindIt(T (*ptr_in)(const T &)){ 
      Parent<T>::fcn_ptr = std::bind(&ptr_in, this, std::placeholders::_1); // Pb #2: here 
     } 
}; 

template<typename T> class Child2 : public Parent<T>{ 
    public: 
     Child2() { 
      BindIt(&fcn_default< T , Child2<T> >); // Pb #1: and here 
     } 
     void BindIt(T (*ptr_in)(const T &)){ 
      Parent<T>::fcn_ptr = std::bind(&ptr_in, this, std::placeholders::_1); 
     } 

     T param2; 
}; 


template<typename T> T fcn_mod1 (const Child1<T> &obj, const T &phit){ 
    return 1.2 + phit; 
} 
template<typename T> T fcn_mod2 (const Child2<T> &obj, const T &phit){ 
    return 2.2 + phit + obj.param2*0.001; 
} 



typedef double lrtType; 

int main(){ 
    std::vector< Parent<lrtType> * > objects; 

    Child1<lrtType> *test11 = new Child1<lrtType>(); 
    objects.push_back(test11); 

    Child1<lrtType> *test12 = new Child1<lrtType>(); 
    //test12->BindIt(&fcn_mod1); 
    objects.push_back(test12); 

    Child2<lrtType> *test2 = new Child2<lrtType>(); 
    //test2->BindIt(&fcn_mod2); 
    test2->param2 = 4; 
    objects.push_back(test2); 

    for (size_t i = 0; i < objects.size(); ++i) { 
     std::cout << objects[i]->do_something(2) << std::endl; 
    } 

    std::cout << "test" << std::endl; 
} 

+++++ UPDATE +++++

나는 코드를 업데이트하지만, 난 여전히 문제 # 2

납 # 2가

: 오류 : '아무 짝을 연산자 = '(피연산자 형식은'std :: function '및'std :: _ Bind_helper) (const double &), Child1 , const std :: _ 자리 표시 자 < 1> &> :: 형식 {일명 std :: _ Bind, std :: _ 자리 표시 자 < 1>)) (const를 더블 &)>} ')

#include <iostream> 
#include <vector> 
#include <cstdlib> 
#include <functional> 

using namespace std; 


template<typename T,typename D> T fcn_default(const D &obj, const T &phit){ 
    return 3.2 + phit; 
} 

template<typename T> class Parent{ 
    public: 
     Parent() {} 
     virtual T do_something (const T &phit) const = 0; 
}; 


template<typename T> class Child1 : public Parent<T>{ 
    public: 
     Child1() { 
      Child1<T>::BindIt(&fcn_default< T , Child1<T> >); 
     } 
     void BindIt(T (*ptr_in)(const Child1 &, const T &)){ 
      fcn_ptr = std::bind(&ptr_in, this, std::placeholders::_1); // Problem here 
     } 
     std::function<T(const Child1 &, const T &)> fcn_ptr; 
     T do_something(const T &phit) const { 
      return this->fcn_ptr(*this,phit); 
     } 
}; 

template<typename T> class Child2 : public Parent<T>{ 
    public: 
     Child2() { 
      Child2<T>::BindIt(&fcn_default< T , Child2<T> >); 
     } 
     void BindIt(T (*ptr_in)(const Child2 &, const T &)){ 
      fcn_ptr = std::bind(&ptr_in, this, std::placeholders::_1); // And here 
     } 
     std::function<T(const Child2 &, const T &)> fcn_ptr; 

     T do_something(const T &phit) const { 
      return this->fcn_ptr(*this,phit); 
     } 

     T param2; 
}; 


template<typename T> T fcn_mod1 (const Child1<T> &obj, const T &phit){ 
    return 1.2 + phit; 
} 
template<typename T> T fcn_mod2 (const Child2<T> &obj, const T &phit){ 
    return 2.2 + phit + obj.param2*0.001; 
} 



typedef double lrtType; 

int main(){ 
    std::vector< Parent<lrtType> * > objects; 

    Child1<lrtType> *test11 = new Child1<lrtType>(); 
    objects.push_back(test11); 

    Child1<lrtType> *test12 = new Child1<lrtType>(); 
    //test12->BindIt(&fcn_mod1); 
    objects.push_back(test12); 

    Child2<lrtType> *test2 = new Child2<lrtType>(); 
    //test2->BindIt(&fcn_mod2); 
    test2->param2 = 4; 
    objects.push_back(test2); 

    for (size_t i = 0; i < objects.size(); ++i) { 
     std::cout << objects[i]->do_something(2) << std::endl; 
    } 

    std::cout << "test" << std::endl; 
} 
+1

'& fcn_default ...이 코드의 중요한 중복 그러나 내가 내가 그것을 피할 수없는 우려하고있다. 나는 그것이 당신이'T (*) (const T &)'에 어떻게 맞을 것이라고 기대하는지 모르겠습니다. – ghostofstandardspast

+0

@ghostofstandardspast ... 나는 정확한 방향을보고 있지 않았습니다. 고맙습니다! – Rufus

답변

0

누군가가 관심이 있다면, 아래에서 작동하는 솔루션입니다. `의``T (*) (const를 자식 1 &, const를 T &)입니다>

#include <iostream> 
#include <vector> 
#include <cstdlib> 
#include <functional> 

using namespace std; 


template<typename T,typename D> T fcn_default(const D &obj, const T &phit){ 
    return 3.2 + phit; 
} 

template<typename T> class Parent{ 
    public: 
     Parent() {} 
     virtual T do_something (const T &phit) const = 0; 

}; 

template<typename T> class Child1 : public Parent<T>{ 
    public: 
     Child1() { 
      fcn_ptr = &fcn_default< T , Child1<T> >; 
     } 
     std::function<T(const Child1<T> &, const T &)> fcn_ptr; 

     T do_something(const T &phit) const { 
      return (*this).fcn_ptr(*this,phit); 
     } 
}; 

template<typename T> class Child2 : public Parent<T>{ 
    public: 
     Child2() { 
      fcn_ptr = &fcn_default< T , Child2<T> >; 
     } 
     std::function<T(const Child2<T> &, const T &)> fcn_ptr; 

     T do_something(const T &phit) const { 
      return (*this).fcn_ptr(*this,phit); 
     } 

     T param2; 
}; 



template<typename T> T fcn_mod1 (const Child1<T> &obj, const T &phit){ 
    return 1.2 + phit; 
} 
template<typename T> T fcn_mod2 (const Child2<T> &obj, const T &phit){ 
    return 2.2 + phit + obj.param2*0.001; 
} 



typedef double lrtType; 

int main(){ 
    std::vector< Parent<lrtType> * > objects; 

    Child1<lrtType> *test11 = new Child1<lrtType>(); 
    objects.push_back(test11); 

    Child1<lrtType> *test12 = new Child1<lrtType>(); 
    test12->fcn_ptr = &fcn_mod1<lrtType>; 
    objects.push_back(test12); 

    Child2<lrtType> *test2 = new Child2<lrtType>(); 
    test2->fcn_ptr = &fcn_mod2<lrtType>; 
    test2->param2 = 4; 
    objects.push_back(test2); 

    for (size_t i = 0; i < objects.size(); ++i) { 
     std::cout << objects[i]->do_something(2) << std::endl; 
    } 

    std::cout << "test" << std::endl; 
} 
+0

질문에 두 번째 예제를 적용하는 데 여전히 관심이 있습니까? – Praetorian

+0

예, std :: function과 std :: bind에 대해 좀 더 배우게 될 것입니다. 나는 그것들에 대한 튜토리얼을 C++ 레퍼런스 만 찾을 수 없었다. – Rufus

관련 문제