Почему тип не может быть выведен в этой функции шаблона?

StackOverflow https://stackoverflow.com/questions/4060082

Вопрос

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'

Это работает, если я уточню чтениеu003Cint> Отказ Есть ли способ получить его, чтобы вывести тип из аргумента?

Это было полезно?

Решение

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