C++ 如何使用boost中依赖模板的信号成员实现模板类?
我尝试实现一个模板类,它需要一个依赖于模板参数的信号成员。我的第一个想法是实现它,如下所示:C++ 如何使用boost中依赖模板的信号成员实现模板类?,c++,templates,boost,signals,C++,Templates,Boost,Signals,我尝试实现一个模板类,它需要一个依赖于模板参数的信号成员。我的第一个想法是实现它,如下所示: template<class T> class SignalClass { typedef boost::signals2::signal<void (T &)> OnReceive; public: SignalClass(const OnReceive::slot_type &_slot) { m_onReceive.
template<class T>
class SignalClass
{
typedef boost::signals2::signal<void (T &)> OnReceive;
public:
SignalClass(const OnReceive::slot_type &_slot)
{
m_onReceive.cnnect(_slot);
}
virtual SignalClass(){};
void Send(T &_val)
{
m_onReceive(_val);
}
private:
OnReceive m_onReceive;
};
并将其作为构造函数的参数,如
PushInputSlot(const slot_type& _slot);
它的工作原理。
但我不知道为什么
我希望有人能帮助我
Thanx,
坦率的
附言:我是stackoverflow的新手,所以我不熟悉这里的规则。希望我做的每件事都是正确的…;-) 以下是添加
typename
(直接在构造函数参数中或在附加的typedef中)有效的原因:
首先,类型OnReceive是所谓的“依赖类型”,因为它取决于模板参数的类型
然后,在编译器中分两个阶段处理模板:第一阶段是编译器遇到模板的源文本时,第二阶段是模板实际实例化时。
在处理的第一阶段,编译器将(应该)尽量验证模板定义是否正确,但在涉及依赖类型时会遇到问题。因为依赖类型取决于模板参数,所以编译器不知道实际类型是什么样子。特别是,当使用
:
运算符访问成员时,编译器需要一些帮助,以确定该成员应该引用成员类型(typedef或嵌套类)还是非类型成员(变量、枚举等)。如果您知道(完整)类型名应该引用某个类型,可以通过在(完整)类型名之前添加typename
来解决此问题。编译器可能遇到问题的另一个地方是,在小于比较中区分成员模板和非模板成员。通过在成员模板名称之前添加关键字
template
(紧跟在运算符之后)来解决此问题.看起来您的工作进展顺利…只是在这里和那里缺少了一个typename
,但是为什么要将boost::signal
类包装在某些内容中,而不是直接在SignaledClass
中使用它呢?
typedef typename OnReceive::slot_type slot_type;
PushInputSlot(const slot_type& _slot);