2014-01-29 3 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; 
} 

Компилятор г ++ говорит

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

Вам нужна декларация шаблона перед точка сделана другом (т. е. предложение friend не может объявить шаблон, как это делается для функций).

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

Смежные вопросы