2017-04-13 82 views
1

../1.63/boost/bind/bind.hpp:75:22:類型'void(*)(const uint32_t & )」不能先用‘::’,因爲它沒有成員boost :: bind無法綁定到純虛擬基類中定義的非靜態函數模板成員類型

我的代碼看起來是這樣的:

template<typename T> 
using RunStep = void (*)(const T& steps); 

template<typename StepType, typename T> 
class Stepper 
{ 
public: 
virtual void StepUp() = 0; 
protected: 
    RunStep<StepType> runStepCallBack; 
    T data; 
} 


class StepperIO : public Stepper<uint32_t, std::string> 
{ 
virtual void StepUp() 
{ 
    boost::bind(runStepCallBack,this, _1); // 
} 
} 

它甚至有可能?它只是一個僞代碼

+0

你想要綁定一個變量嗎? 'runStepCallBack'不是一個函數! –

+0

@TheQuantumPhysicist'runStepCallBack'是'RunStep '類型的成員,它是一個函數指針,所以你可以在其上使用'bind'。 – Holt

+0

@NulledPointer最後解釋你想要什麼 - 你將如何使用'boost :: bind'的結果?完全不清楚你想在這裏做什麼......'runStepCallBack'是一個指向一個函數的指針,它需要一個'uint32_t',並且你試圖用''StepperIO *''類型'this'來綁定它。 – Holt

回答

1

如果回調還必須訪問實際步進器實例的成員,那麼,沒有。無論是

  1. 你明確地傳遞this參數步入回調(公共API的經常使用像void* user_data「不透明」的說法)
  2. 或創建一個函數對象,例如使用lambda,boost :: bind,std :: bind或手動。函數對象可以保持狀態。標準庫和boost有這樣的回調類型擦除容器:std::function<void(T)>(或boost::function<...>)。

演示:

Live On Coliru

#include <boost/bind.hpp> 
#include <boost/function.hpp> 
#include <iostream> 

template<typename T> 
using RunStep = boost::function<void(const T& steps)>; 

template<typename StepType, typename T> 
class Stepper 
{ 
    public: 
     virtual void StepUp() = 0; 
    protected: 
     RunStep<StepType> runStepCallBack; 
     T data; 
}; 

class StepperIO : public Stepper<uint32_t, std::string> 
{ 
    public: 
    template <typename F> 
    void setCallback(F f) { runStepCallBack = f; } 
    virtual void StepUp() { runStepCallBack(1); } 
}; 

struct Sample { 
    void foo(int32_t i) const { std::cout << __FUNCTION__ << "(" << i << ")\n"; } 
    void bar(int32_t i) const { std::cout << __FUNCTION__ << "(" << i << ")\n"; } 
    void qux(int32_t i) const { std::cout << __FUNCTION__ << "(" << i << ")\n"; } 
}; 

int main() { 
    StepperIO io; 

    Sample demo; 
    io.setCallback(std::bind(&Sample::foo, demo, std::placeholders::_1)); 
    io.StepUp(); 

    io.setCallback(boost::bind(&Sample::bar, demo, _1)); 
    io.StepUp(); 

    io.setCallback([&demo](int32_t i) { demo.qux(i); }); 
    io.StepUp(); 
} 

打印

foo(1) 
bar(1) 
qux(1) 

我的感覺是,類型擦除正是你要找的人,看多啓發答案:

+0

添加了對類型擦除多態性的引用,因爲它「聞起來像」你正在尋找那 – sehe

+0

謝謝,你知道那個錯誤意味着什麼嗎? – PnotNP

+0

@NulledPointer當然!這意味着在'::'之前不能使用'void(*)(const uint32_t&)'類型。換句話說,這個類型(你傳遞的是'RunStep ')在'::'之前被使用(你顯然可以看看boost/bind/bind.hpp的第75行,你很明顯會發現一些東西就像第22列的':: result_type'或類似的東西。只是猜測。 – sehe

相關問題