Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用boost中依赖模板的信号成员实现模板类?_C++_Templates_Boost_Signals - Fatal编程技术网

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);