为什么不能在此模板函数中推导出类型?

时间:2010-10-30 18:24:43

标签: c++ templates c++11 enable-if

template<typename T>
std::istream & read(std::istream & istr, typename std::enable_if<std::is_pod<T>::value, T>::type & value)
{
    return istr.read( reinterpret_cast<char*>(&value), sizeof(T));
}

int main() 
{
    int x;
    read(cin, x); // error here
}


error C2783: 'std::istream &read(std::istream &,std::enable_if<std::tr1::is_pod<_Ty>::value,T>::type &)' : could not deduce template argument for 'T'

如果我指定read&lt; int&gt;,它会起作用。有没有办法让它从论证中推断出类型?

1 个答案:

答案 0 :(得分:15)

template<typename T>
std::istream & read(std::istream & istr, T value, 
                    typename std::enable_if<std::is_pod<T>::value>::type* = 0)
{
    return istr.read( reinterpret_cast<char*>(&value), sizeof(T));
}

或者

template<typename T>
typename std::enable_if<std::is_pod<T>::value, std::istream>::type &
read(std::istream & istr, T value)
{
    return istr.read( reinterpret_cast<char*>(&value), sizeof(T));
}

你的原因不起作用的原因是,如果你知道参数的类型,那么确定T是不够的。如果enable_if成为如下模板,该怎么办?

template<int N, typename T> struct A { typedef int type; };

T中的任何<std::is_pod<T>::value, T>都会这样做。 通常,...T...::type形成的函数参数类型称为非推导上下文,不能用于推导T