2010-06-15 52 views
3

我定義的一些信號:升壓信號和傳球類方法

typedef boost::signals2::signal<void (int temp)> SomeSig; 
typedef SomeSig::slot_type SomeSigType; 

我有一些類:

class SomeClass 
{ 
    SomeClass() 
    { 
    SomeSig.connect(&SomeClass::doMethod); 
    } 
    void doMethod(const SomeSig &slot); 
}; 

,並得到了很多錯誤:

error: ‘BOOST_PP_ENUM_SHIFTED_PARAMS_M’ was not declared in this scope 
error: ‘T’ was not declared in this scope 
error: a function call cannot appear in a constant-expression 
error: a function call cannot appear in a constant-expression 
error: template argument 1 is invalid 
error: ‘BOOST_SIGNALS2_MISC_STATEMENT’ has not been declared 
error: expected identifier before ‘~’ token 
error: expected ‘)’ before ‘~’ token 
error: expected ‘;’ before ‘~’ token 

UPD: 新代碼(相同錯誤):

typedef boost::signals2::signal<void (int keyCode)> SigKeyPressed; 
typedef SigKeyPressed::slot_type SigKeyPressedType; 

class SomeClass 
{ 
     SigKeyPressed mSigKeyPressed; 

    public: 
     SomeClass() { mSigKeyPressed.connect(&SomeClass::keyPressed); } 
     void keyPressed(const SigKeyPressedType &slot); 
}; 

回答

4

帕維爾和基思都是正確的(兩者皆爲+1)。 SomeSig是一個類型,你不能調用類型。您必須實例化SomeSig。使用方法函數指針時,您還必須提供一個指向該對象的指針。 _1是綁定期間需要的佔位符,指示綁定的方法函數指針需要單個參數。

typedef boost::signals2::signal<void (int keyCode)> SigKeyPressed; 
typedef SigKeyPressed::slot_type SigKeyPressedType; 

class SomeClass 
{ 
     SigKeyPressed mSigKeyPressed; 

    public: 
     SomeClass() { mSigKeyPressed.connect(boost::bind(&SomeClass::keyPressed, this, _1); } 
     void keyPressed(const SigKeyPressedType &slot); 
}; 
3

使用boost :: bind。

SomeSig.connect(bind(&SomeClass::doMethod, this, _1)); 

的事情是,你的信號需要隱藏this指針,即採取行動的一些對象。 或者,您可以將它傳遞給靜態方法的指針。

2

SomeSig是一個類型,而不是一個對象。您需要定義一個信號對象並調用該對象上的連接。另外,是doMethod(),插槽參數的類型是錯誤的。

class SomeClass 
{ 
    SomeClass() 
    { 
    signal.connect(&SomeClass::doMethod); 
    } 
    void doMethod(const SomeSigType &slot); 
private: 
    SomeSig signal; 

};

+0

我已更新我的信息。仍然得到相同的錯誤。 – Ockonal 2010-06-15 17:38:13