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'

它的工作原理,如果我指定阅读的。有什么办法得到它推断从参数类型?

有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top