boost :: signals를 사용하여 컴파일 오류를 제거하지 못했습니다. 어떤 아이디어라도 감사 할 것입니다.컴파일 오류 : 클래스 템플릿이 없습니다. 초기화 프로그램이 너무 많고 일치하는 함수가 없습니다.
2 년 전에 작성된 프로그램을 현재 환경에 맞게 포팅 했으므로 나는 boost :: signals에 대한 새로운 지식을 가지고 있습니다. 아래의 코드는 원래 프로그램을 수정하여 질문 목적을 단순화 한 것입니다.
제 질문에 대한 직접적인 해결책을 원합니다. 하지만 그 외에, boost :: signals에 관한 많은 질문이 있기 때문에 (그러나 어느 것이 올바른지/내 사건과 가장 가까운지를 알아내는 것을 포기했습니다), 대답에서 제안하는 것에 투표 할 것입니다. 더 나은 아카이브 된 질문을 만들기 위해이 질문의 더 적합한 제목을 표시하십시오.
boostProve_Doc.h
#ifndef FC_H
#define FC_H
#include <vector>
#include "iostream"
#include "boost/signal.hpp"
typedef boost::signal<void()> PostUpdateSignal;
typedef PostUpdateSignal::slot_function_type PSlot;
class Doc {
public:
Doc(uint width, uint height) {
std::cout << "In constructor. width= " << width << ", height= "
<< height << std::endl;
}
~Doc() {
//Do ...
}
void connectPostUpdate(PSlot s) {
sig.connect(s);
}
protected:
PostUpdateSignal sig;
};
#endif
boostProve_View.cpp :
#include <string>
#include <iostream>
#include <boost/thread.hpp>
#include <boost/date_time.hpp>
#include <boost/bind.hpp>
#include <boostProve_Doc.h>
using namespace std;
class View {
public:
View() {
setupCrowd();
}
~View() {
//do something...
}
private:
Doc *crowd_;
void setupCrowd() {
crowd_->connectPostUpdate(&View::correctR);
}
void correctR() {
// do something..
}
};
int main(int argc, char** argv) {
View c();
return 0;
}
오류 :
환경$ g++ boostProve_View.cpp -I . /usr/lib/libboost_signals.so
In file included from /usr/include/boost/function/detail/maybe_include.hpp:13,
from /usr/include/boost/function/detail/function_iterate.hpp:14,
from /usr/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:47,
from /usr/include/boost/function.hpp:64,
from /usr/include/boost/thread/future.hpp:20,
from /usr/include/boost/thread.hpp:24,
from boostProve_View.cpp:3:
/usr/include/boost/function/function_template.hpp: In member function ‘void boost::function0<R>::assign_to(Functor) [with Functor = void (View::*)(), R = void]’:
/usr/include/boost/function/function_template.hpp:722: instantiated from ‘boost::function0<R>::function0(Functor, typename boost::enable_if_c<boost::type_traits::ice_not::value, int>::type) [with Functor = void (View::*)(), R = void]’
/usr/include/boost/function/function_template.hpp:1064: instantiated from ‘boost::function<R()>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not::value, int>::type) [with Functor = void (View::*)(), R = void]’
boostProve_View.cpp:20: instantiated from here
/usr/include/boost/function/function_template.hpp:903: error: no class template named ‘apply’ in ‘struct boost::detail::function::get_invoker0<boost::detail::function::member_ptr_tag>’
/usr/include/boost/function/function_template.hpp:913: error: too many initializers for ‘boost::detail::function::basic_vtable0<void>’
/usr/include/boost/function/function_template.hpp: In member function ‘bool boost::detail::function::basic_vtable0<R>::assign_to(F, boost::detail::function::function_buffer&) [with F = void (View::*)(), R = void]’:
/usr/include/boost/function/function_template.hpp:915: instantiated from ‘void boost::function0<R>::assign_to(Functor) [with Functor = void (View::*)(), R = void]’
/usr/include/boost/function/function_template.hpp:722: instantiated from ‘boost::function0<R>::function0(Functor, typename boost::enable_if_c<boost::type_traits::ice_not::value, int>::type) [with Functor = void (View::*)(), R = void]’
/usr/include/boost/function/function_template.hpp:1064: instantiated from ‘boost::function<R()>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not::value, int>::type) [with Functor = void (View::*)(), R = void]’
boostProve_View.cpp:20: instantiated from here
/usr/include/boost/function/function_template.hpp:492: error: no matching function for call to ‘boost::detail::function::basic_vtable0<void>::assign_to(void (View::*&)(), boost::detail::function::function_buffer&, boost::detail::function::basic_vtable0<R>::assign_to(F, boost::detail::function::function_buffer&) [with F = void (View::*)(), R = void]::tag)’
: 우분투 10.10, g ++ (우분투/리나 4.4.4-14ubuntu5) 4.4.5
9/30/11 업데이트) 제안 덕분에, 나는이 작업을 수행하여 문제를 해결 :
crowd_->connectPostUpdate(boost::bind(&View::correctR, this));
감사합니다. 왜냐하면 내 경우에는 static을 만드는 것이 불가능하기 때문에 boost :: bind를 사용하여 문제 부분에 추가 한 것처럼 해결했다. – IsaacS