模板参数推导/替换失败。 ÿ?

时间:2015-08-08 11:28:16

标签: c++ c++11

template <bool,typename T>
struct enabler
{

};

template <typename T>
struct enabler<true,T>
{
    typedef T type;
};


template <typename T>
void test1(typename enabler< is_integral<T>::value,T >::type input)
{
    cout << "this is for only integral" << endl;
}

int main()
{
    test1(10);//error
    test1<int>(10); // compiles fine

    return 0;
}

编译失败,显示错误消息。

注意:模板参数扣除/替换失败

注意:无法推断模板参数'T'

当明确指定参数时,没关系。但如果不是,编译器会发现推理出现问题。为什么呢?

1 个答案:

答案 0 :(得分:2)

T中的{p> typename enabler<is_integral<T>::value, T>::type是不可扣除的:

§14.8.2.5[temp.deduct.type] / p5:

  

未推断的上下文是:

     

(5.1) - 使用 qualified-id 指定的类型的嵌套名称说明符

一个选项是将enabler置于返回类型语法中,并将T推导为普通参数:

template <typename T>
typename enabler<std::is_integral<T>::value, void>::type test1(T input)
{
    std::cout << "this is for only integral" << std::endl;
}

DEMO