我试图使用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;
}当我编译时,我会看到(编译)错误:
是否对模板使用boost信号有任何限制?我不使用C++11。
任何建议/帮助都是非常感谢的。
发布于 2014-08-14 15:05:23
模板类型为非法,但您可以在C++11中使用using:
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-14 15:06:18
您的问题是,因为您引用的typedef模板是非法的。是的,您不能有一个模板typedef,而且它与boost::signals没有多大关系。
在C++11中,它们引入了类型别名,您可以使用这些别名。
template<class T> using Sig_t = <your type>https://stackoverflow.com/questions/25311369
复制相似问题