如果以std :: is为基础的话

我有以下代码:

#include <iostream>
#include <type_traits>

template <typename T, typename std::enable_if
                                 <std::is_convertible<int, T>::value, T>::type>
void func(T a)
{
    std::cout << a << std::endl;
}

template <typename T, typename std::enable_if
                                 <!std::is_convertible<int, T>::value, T>::type>
void func(T a)
{
    a.print();
}

class Test
{
public:
    void print()
    {
        std::cout << "Test" << std::endl;
    }
};    

int main()
{
    func(3);
    func("Test");
    return 0;
}

有了这段代码,我期望第一次调用func来打印出3 (因为int可以转换为int ,第一个专门化应该被调用),第二次调用func打印出TestTest()不可转换为int ,所以应该调用第二个专业化)。 但是,我反而得到一个编译器错误:

prog.cpp:在函数'int main()'中:

prog.cpp:27:8:错误:没有用于调用'func(int)'的匹配函数

prog.cpp:5:6:note:candidate:template [class T,typename std :: enable_if [std :: is_convertible [int,T> :: value,T> :: type> void func(T)

prog.cpp:5:6:注意:模板参数推导/替换失败:

prog.cpp:27:8:注意:不能推导出模板参数'[anonymous>'

但是,如果我将模板化功能更改为(而将所有其他内容完全相同):

template <typename T, typename std::enable_if
                                 <std::is_convertible<int, T>::value, T>::type* =
                                  nullptr>
void func(T a)
{
    std::cout << a << std::endl;
}

template <typename T, typename std::enable_if
                                 <!std::is_convertible<int, T>::value, T>::type* =
                                  nullptr>
void func(T a)
{
    a.print();
}

那么所有的东西都会按我的预期编译和工作。 这是什么额外的语法,为什么我需要它?


template<typename T, typename std::enable_if<std::is_convertible<int, T>::value, T>::type>

如果我们要消除噪音,就会变成

template<typename T, typename Something<T>::type>

它声明第二个参数是一个非类型参数,这里的typename指定嵌套type是一个type的名称。 浏览此处获取更多信息。

在第一种情况下,第二个参数是非类型的,所以函数调用func(3)不适合期望func<int, some_int>(3)的模板。

链接地址: http://www.djcxy.com/p/90143.html

上一篇: if predicated on std::is

下一篇: Call to base member function template ambiguity in C++