c++ - 显式函数模板特化选择了错误的特化

标签 c++ templates template-specialization

我在一个类中有 2 个函数,一个是 operator+= 的默认规范,它需要某种函数,而第二个规范需要一个 EventHandler,这是实现:

    template<typename _Func>
    timed_function<_Sig>& operator+=( _Func &&f )
    {
        // Create an unamed handler
        auto handler = new EventHandler<_Sig>( "unamed", std::forward<_Func>( f ) );

        // Push it
        _fs.push_back( handler );

        // Return a reference to the function
        return handler->get( );
    }

这是专门的版本:

template<>
timed_function<_Sig>& operator+=<const EventHandler<_Sig>&>( const EventHandler<_Sig> &_Handler )
{
    // Copy the handler and push it
    _fs.push_back( new EventHandler<_Sig>( _Handler ) );

    // Return a reference to the function
    return _fs.back( )->get( );
}

在哪里_fs只是 EventHandler<_Sig> 的 vector 指针。 和 _Sig作为函数签名(例如 void(int) )

例如在 lambda 函数上使用 += 运算符时,它工作得很好,编译器会选择正确的特化:

window->OnKeyDown( ) += []( dx::Window *sender, dx::KeyDownArgs &args )
{
    [...]
};

OnKeyDown( )返回对 Event<void(dx::Window*, dx::KeyDownArgs&)> 实例的引用

但是,当我尝试像这样手动添加 EventHandler 时,它仍然会选择该函数的非专用版本。

window->OnKeyDown( ) += EventHandler<void(dx::Window*, dx::KeyDownArgs&)>( "Key Handler", 
                        []( dx::Window *sender, dx::KeyDownArgs &args ) 
                        {
                            [...]
                        } );

谢谢!

最佳答案

您提供 EventHandler<_Sig>&&不是const EventHandler<_Sig>& , 因此选择了非专用版本。

关于c++ - 显式函数模板特化选择了错误的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36430402/

相关文章:

c++ - 从 0 到 10^18 的数字总和,模数为 10^9+7

C++ 我应该使用模板,我即将创建一个词法分析器,为什么它应该是有限的字符?

c++ - QNetworkAccessManager 一个实例和连接槽

javascript - CKEditor 中的自定义模板

c++ - 初始化列表模板变量

c++ - 未使用 CPPUnit 的模板特化

c++ - 关于调用具有专门模板的类的混淆

c++ - 使用带有可变参数字符串的函数

c++ - 模板特化 "inherit"成员/函数不是吗?

c++ - 如何专门化用作函数参数的模板类型名?