Question

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'

Il fonctionne si je lis spécifions . Est-il possible de l'obtenir pour en déduire le type de l'argument?

Était-ce utile?

La solution

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));
}

ou

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));
}

La raison pour laquelle le vôtre ne fonctionne pas est parce qu'il ne suffit pas pour déterminer T si vous connaissez le type de l'argument. Que faire si enable_if serait un modèle comme suit?

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

Toute T en <std::is_pod<T>::value, T> le ferait. En général, un type de paramètre de fonction formé par ...T...::type est appelé un contexte non déduite et ne peut être utilisé pour en déduire T.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top