SFINAE没有编译

时间:2015-07-21 12:29:42

标签: c++11 sfinae enable-if

我以前经常使用过SFINAE,但我有一个非常简单的例子,我今天无法运行。

class X
{
    public:
        template <typename CHECK, typename = typename std::enable_if< std::is_floating_point<CHECK>::value, void>::type >
            void Do()
            {
                std::cout << "yes" << std::endl;
            }

        template <typename CHECK, typename = typename std::enable_if< !std::is_floating_point<CHECK>::value, void>::type>
            void Do()
            {
                std::cout<< "no" << std::endl;
            }

};

int main()
{
    X x;
    x.Do<float>();
}

错误:

src / main.cpp:20:18:错误:&#39;模板void X :: Do()&#39;不能超载

src / main.cpp:14:18:错误:使用&#39;模板void X :: Do()&#39;              void Do()

我想用enable_if禁用任何重载但它不起作用......

知道今天我做错了什么?

2 个答案:

答案 0 :(得分:3)

这两个函数具有相同的sigature,因此您会收到重定义错误。请尝试使用以下代码,它使用默认参数:

#include <type_traits> 
#include <iostream>

class X
{
    public:
        template <typename CHECK, std::enable_if_t< std::is_floating_point<CHECK>::value>* =nullptr >
            void Do()
            {
                std::cout << "yes" << std::endl;
            }

        template <typename CHECK, std::enable_if_t< !std::is_floating_point<CHECK>::value>* =nullptr>
            void Do()
            {
                std::cout<< "no" << std::endl;
            }

};

int main()
{
    X x;
    x.Do<float>();
}

DEMO

另请参阅答案herehere

答案 1 :(得分:0)

另一种编译和工作的语法是将enable_is作为返回类型移动:

class X
{
public:
    template <typename CHECK >
    typename std::enable_if< std::is_floating_point<CHECK>::value, void>::type Do()
    {
        std::cout << "yes" << std::endl;
    }

    template <typename CHECK>
    typename std::enable_if< !std::is_floating_point<CHECK>::value, void>::type Do()
    {
        std::cout << "no" << std::endl;
    }

};

int main()
{
    X x;
    x.Do<float>();
    getchar();
}