提升信号和传递类方法

时间:2010-06-15 17:06:47

标签: c++ boost signals

我已定义了一些信号:

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

3 个答案:

答案 0 :(得分:4)

Pavel和Keith都是正确的(两者都是+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);
};

答案 1 :(得分:3)

使用boost :: bind。

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

问题是,你的信号需要一个隐藏的this指针,即作用于某个物体。 或者,您可以将指针传递给静态方法。

答案 2 :(得分:2)

SomeSig是一种类型,而不是一种对象。您需要定义一个信号对象并在该对象上调用connect。此外,是doMethod(),插槽参数的类型是错误的。

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

};