2011-09-23 37 views
0

我一直無法使用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)’ 

環境:Ubuntu的10.10,克++(Ubuntu的/ Linaro的4.4.4-14ubuntu5) 4.4.5


11年9月30日更新)由於建議,我做這個問題得到了解決:

crowd_->connectPostUpdate(boost::bind(&View::correctR, this)); 

回答

1

的問題是,你的插槽希望void (*)()類型的函數,而你給它一個類型爲void (View::*)()的參數。不幸的是,成員函數指針與函數指針不同。解決這個問題的一個方法是使​​爲靜態,這會給它一個正確的簽名。如果失敗了,您可能需要調查諸如Boost的綁定庫等內容。

以獲得更多關於指針成員函數參見this part of the C++ FAQ Lite

+0

謝謝。因爲在我的情況下,使靜態是不可能的,所以我通過使用boost :: bind解決,因爲我在問題部分添加。 – IsaacS

相關問題