사용자가 인스턴스 수준에서 함수의 동작을 수정하고이 인스턴스의 멤버에 계속 액세스 할 수있는 라이브러리를 만들려고합니다. . 이 게시물은 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;
}
'& fcn_default ...이 코드의 중요한 중복 그러나 내가 내가 그것을 피할 수없는 우려하고있다. 나는 그것이 당신이'T (*) (const T &)'에 어떻게 맞을 것이라고 기대하는지 모르겠습니다. –
ghostofstandardspast
@ghostofstandardspast ... 나는 정확한 방향을보고 있지 않았습니다. 고맙습니다! – Rufus