2010-10-30 90 views
4
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' 

它工作,如果我指定讀取<int>。有什麼辦法讓它從參數中推斷出類型?爲什麼在這個模板函數中不能推導出類型?

回答

15
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

+0

完美,謝謝。 – 2010-10-30 18:42:31

+0

你說「一般」,否則有特定情況? – GManNickG 2010-10-30 18:46:14

+0

@GMan我想不出另一種情況。固定。 – 2010-10-30 18:48:30

相關問題