0

C++ テンプレートでブースト信号とスロットを使用しようとしています。コード例は次のとおりです。

#include <iostream>
#include <sstream>
#include <string>

#include <boost/signals2/signal.hpp>

template<class T>
class JBase
{
public:
    JBase(T &d) : data(d)
    {}
    virtual ~JBase() {}
    virtual bool DoSomething(std::string &outStr) = 0;

protected:
T data;
};

class LToUse : public JBase<int>
{
public:
   LToUse(int d) : JBase<int>(d) {}
   virtual ~LToUse() {}
   bool DoSomething(std::string &outStr)
   {
      std::ostringstream s;
      s << data;
      outStr = s.str();
      return true;
   }
};

template<class T>
typedef boost::signals2::signal<void(const JBase<T> &jsonObj)>::slot_type Sig_t;

class CBHndlr
{
   CBHndlr()
   {
      // I get errors even on this line...??
      //Sig_t t = boost::bind(&CBHndlr::TestCb, this, _1);
      //m_Signal.connect(t)
   }

   template<class T>
   void TestCb(JBase<T> *obj)
   {

   }

private:
   template<class T>
   boost::signals2::signal<void(JBase<T>)> m_Signal;
};

template<class T>
void TestJL(JBase<T> *obj)
{
   std::string s;
   obj->DoSomething(s);
   std::cout << "Did Something: " << s;
}

コンパイルすると、次のような (コンパイル) エラーが発生します。

  1. typedef テンプレートが不正です
  2. 構文エラー: ';' がありません 識別子「Sig_t」の前

テンプレートでブースト信号を使用する際に制限はありますか? 参考までに - 私は C++11 を使用していません。

どんな提案/助けも大歓迎です。

4

2 に答える 2

2

テンプレートの typedef違法ですがusing、C++11 では使用できます。

template<class T>
using Sig_t = typename boost::signals2::signal<void(const JBase<T> &jsonObj)>::slot_type;

C++03 では、

構造体の中にカプセル化することができます:

template <typename T>
struct Sig
{
    typedef typename boost::signals2::signal<void(const JBase<T> &jsonObj)>::slot_type type;
};

そして、使用しますSig<T>::type

編集:以下が役立つ場合があります:

template <typename T>
class CBHndlr
{
   CBHndlr()
   {
      typename Sig<T>::type t = boost::bind(&CBHndlr::TestCb, this, _1);
      m_Signal.connect(t)
   }

   void TestCb(JBase<T> *obj) {}
private:
   boost::signals2::signal<void(JBase<T>)> m_Signal;
};
于 2014-08-14T15:05:23.127 に答える
0

typedef template is illegalを引用したときの問題です。つまり、テンプレートの typedef を持つことはできず、boost::signals とはあまり関係がありません。

C++11 では、代わりに使用できる型エイリアスが導入されました

template<class T> using Sig_t = <your type>
于 2014-08-14T15:06:18.223 に答える