2014-01-29 37 views
1

我不知道當試圖重載>>和< <模板和重載的IStream

template<class T, int N> class vector{ 
    friend istream &operator>> <T,N>(istream &, vector &); 
    friend ostream &operator<< <T,N>(ostream &, const vector &); 
}; 

template<class T, int N> 
istream &operator>>(istream &input, vector<T,N>& v) 
{ 
    for (int i=0; i<N; i++) 
     input >> v.component[i]; 
    return input; 
} 

g ++編譯器說

vector.h:22:17: error: template-id ‘operator>><double, 2>’ for 
‘std::istream& operator>>(std::istream&, vector<double, 2>&)’ 
does not match any template declaration 
friend istream &operator>> <T,N>(istream &, vector &); 
      ^
vector.h:23:17: error: template-id ‘operator<< <double, 2>’ for 
‘std::ostream& operator<<(std::ostream&, const vector<double, 2>&)’ 
does not match any template declaration 
friend ostream &operator<< <T,N>(ostream &, const vector &); 
      ^
+1

是'vecotr'您自己的類,還是它是'std :: vector' ?? –

+0

這是我自己的班級。謝謝。 – user2448054

回答

1

您需要的模板之前的聲明什麼是錯的它成爲朋友的一點(即朋友子句不能像聲明函數那樣聲明模板)。

template<class T, int N> class vector; 
template<class T, int N> 
istream &operator>>(istream &input, vector<T,N>& v); 
template<class T, int N> 
ostream &operator<<(ostream &input, vector<T,N> const& v); 

template<class T, int N> class vector{ 
    friend istream &operator>> <T,N>(istream &, vector &); 
    friend ostream &operator<< <T,N>(ostream &, const vector &); 
}; 

template<class T, int N> 
istream &operator>>(istream &input, vector<T,N>& v) 
{ 
    for (int i=0; i<N; i++) 
     input >> v.component[i]; 
    return input; 
} 
+0

謝謝。它的工作原理與我想要的一樣! – user2448054

0

您編寫過載的方式表示函數模板專業化。因此,由於沒有以前聲明的主模板,所以錯誤。如果這是主要的定義(這),你只需要從封閉類聲明模板參數,因爲當你使用類名作爲參數他們impiled:

template<class T, int N> class vector { 
    friend istream &operator>> (istream &, vector &); 
    friend ostream &operator<< (ostream &, const vector &); 
}; 

這只是特殊函數的類內聲明。您也可以接受不同類型和值的模板參數:

template<class T, int N> class vector { 
    template<class T2, int N2> 
    friend istream &operator>> (istream &, vector<T2, N2> &); 

    template<class T2, int N2> 
    friend ostream &operator<< (ostream &, const vector<T2, N2> &); 
}; 
+0

謝謝!它工作得很好。 – user2448054