问题如下:
class LaNum
{
public:
/*
用这里面的代码替换下面的模板函数,就不会报错
template<class T>
LaNum(T x)
{
}
*/
template<class T>
LaNum(typename std::enable_if<true,T>::type x)
{
}
};
LaNum p(1); //这里会报错
这是为什么?
问题如下:
class LaNum
{
public:
/*
用这里面的代码替换下面的模板函数,就不会报错
template<class T>
LaNum(T x)
{
}
*/
template<class T>
LaNum(typename std::enable_if<true,T>::type x)
{
}
};
LaNum p(1); //这里会报错
这是为什么?
因为typename std::enable_if<true,T>::type是一个non-deduced context,也就是说编译器不会对模板参数T进行类型推断。要解释的话就是T和type可以不相同,从LaNum p(1)只可能推断出type是int,但是不能推断出T的类型也是int。只是std::enable_if的实现中T和type恰好相同,而编译器不会只考虑特例。
c++ - What is a nondeduced context? - Stack Overflow
https://stackoverflow.com/questions/25245453/what-is-a-nondeduced-context
所以必须有其他参数用于推断T的类型。