Por que o tipo não pode ser deduzido nesta função de modelo?
Pergunta
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'
Funciona se eu especificar leru003Cint> . Existe alguma maneira de deduzir o tipo do argumento?
Solução
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));
}
A razão pela qual a sua não funciona é porque não é suficiente para determinar T se você souber o tipo de argumento. E se enable_if
seria um modelo como o seguinte?
template<int N, typename T> struct A { typedef int type; };
Algum T
dentro <std::is_pod<T>::value, T>
faria isso. No geral, um tipo de parâmetro de função formado por ...T...::type
é chamado de contexto não deduzido e não pode ser usado para deduzir T
.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow