首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有boost signals2的signals2模板类

带有boost signals2的signals2模板类
EN

Stack Overflow用户
提问于 2014-08-14 15:02:11
回答 2查看 1.1K关注 0票数 0

我试图使用C++模板的升压信号和插槽。下面是示例代码:

代码语言:javascript
复制
#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. 模板是非法的
  2. 语法错误:在标识符'Sig_t‘之前缺少';’

是否对模板使用boost信号有任何限制?我不使用C++11。

任何建议/帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-14 15:05:23

模板类型为非法,但您可以在C++11中使用using

代码语言:javascript
复制
template<class T>
using Sig_t = typename boost::signals2::signal<void(const JBase<T> &jsonObj)>::slot_type;

在C++03中,

您可以将其封装在结构中:

代码语言:javascript
复制
template <typename T>
struct Sig
{
    typedef typename boost::signals2::signal<void(const JBase<T> &jsonObj)>::slot_type type;
};

然后使用Sig<T>::type

编辑:以下内容可能对您有所帮助:

代码语言:javascript
复制
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;
};
票数 2
EN

Stack Overflow用户

发布于 2014-08-14 15:06:18

您的问题是,因为您引用的typedef模板是非法的。是的,您不能有一个模板typedef,而且它与boost::signals没有多大关系。

在C++11中,它们引入了类型别名,您可以使用这些别名。

代码语言:javascript
复制
template<class T> using Sig_t = <your type>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25311369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档