Повышение сигналов и прохождение метода класса - PullRequest
3 голосов
/ 15 июня 2010

Я определил некоторый сигнал:

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 ]

4 голосов
/ 16 июня 2010

И Павел, и Кит верны (+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 голосов
/ 15 июня 2010

Используйте boost :: bind.

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

Дело в том, что для вашего сигнала требуется скрытый указатель this, т.е. для воздействия на какой-либо объект.Кроме того, вы можете передать ему указатель на статический метод.

2 голосов
/ 15 июня 2010

SomeSig - это тип, а не объект.Вам нужно определить объект сигнала и вызвать connect для этого объекта.Кроме того, это doMethod(), тип параметра слота был неправильным.

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

};

...