質問

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