Вам необходимо указать тип: List::Item<T>
.
Вы можете использовать неквалифицированное имя типа, когда находитесь внутри объявления класса или внутри списка аргументов или тела каждой из функций-членов типа (или производных классов), но не для возвращаемого типа , Когда компилятор разрешает тип возвращаемого значения, он еще не знает, что вы определяете элемент шаблона List
, и поэтому не будет заглядывать внутрь области этого класса.
Это интересный момент о том, как работают компиляторы, который фактически повлиял на некоторые изменения в будущем стандарте, позволяющие auto
подобно определениям возвращаемого типа:
template<typename T, typename U>
auto sum( T lhs, U rhs ) -> delctype(lhs+rhs)
{ return lhs+rhs; }
Компилятор может выводить типы T
и U
при наличии аргументов, но вы не можете сказать, что тип возвращаемого значения decltype(lhs+rhs)
как тип возвращаемого значения, поскольку ни lhs
, ни rhs
пока нет в рамках. Хотя это проблема только C ++, она имеет корни в той же проблеме, с которой вы сталкиваетесь: область действия возвращаемого типа является внешней по сравнению с областью действия метода, который объявлен.