Эти сообщения об ошибках действительно принадлежат друг другу:
a.cc:41: error: declaration of ‘class L’
a.cc:26: error: shadows template parm ‘class L’
Это означает, что в строке 41 вы вводите параметр шаблона L;в моей копии это относится к
template <class L> friend ostream & operator<<(ostream& os,
const LinkedList<L> listToprint);//error two
И это объявление затеняет параметр шаблона в строке 26:
template <class L>//error one
class LinkedList
Вам необходимо переименовать параметр шаблона в объявлении друга.
Редактировать : Соответствующая языковая спецификация - 14.6.1 / 7
Параметр шаблона не должен быть повторно объявлен в своей области (включая вложенные области видимости).Параметр шаблона не должен совпадать с именем шаблона.
Когда вы ссылаетесь на L
в const LinkedList<L> listToprint
, неясно, имеете ли вы в виду L друга или Lкласса.Так что пиши
template <class L1> friend ostream & operator<<(ostream& os,
const LinkedList<L1> listToprint);