2011-09-23 2 views
0

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)); 

답변

1

문제는 당신이있어 반면에 당신의 슬롯을 입력 void (*)()의 기능을 원하는 것입니다 형식을 void (View::*)()으로 지정하십시오. 불행히도 멤버 함수 포인터는 함수 포인터와 같지 않다. 이 문제를 해결할 수있는 한 가지 방법은 올바른 서명을 부여하는 correctR을 정적으로 만드는 것입니다. 이것이 실패 할 경우, Boost 's Bind 라이브러리와 같은 것을 조사 할 수 있습니다.

멤버 함수에 대한 포인터에 대한 자세한 내용은 this part of the C++ FAQ Lite을 참조하십시오.

+0

감사합니다. 왜냐하면 내 경우에는 static을 만드는 것이 불가능하기 때문에 boost :: bind를 사용하여 문제 부분에 추가 한 것처럼 해결했다. – IsaacS

관련 문제