Создал шаблон класса односвязного списка с перегруженным оператором вывода. Когда совершаю операцию вывода для классов с разными типами в одном блоке, пишет ошибку:
error: redefinition of 'template std::ostream& operator<<(std::ostream&, const List&)'.
Код:
#include <iostream>
using namespace std;
template<class T, int size>
class List
{
public:
struct Item{
T value;
struct Item *next = nullptr;
};
struct Item* BeginList = nullptr;
int last = 0;
template<class U, int Size>
friend ostream& operator<< (ostream &os, const List<U, Size>& list){
struct Item* item = (Item*)list.BeginList;
os << "List ( " << list.last+1 << " )" << endl;
while (item){
os << item->value << endl;
item = item->next;
}
return os;
}
};
int main(){
List<int, 5> ListInt;
List<char, 5> ListChar;
cout << ListInt << endl; //тут выводит
cout << ListChar << endl; //тут ошибка
return 1;
}
Можно ли как то исправить это? Или нужно специализировать для всех типов?