В вашем коде нет ничего плохого.На самом деле, я бы, вероятно, написал бы это как
template<class T>
struct node
{
T value;
bool isFirst;
node<T> *next;
};
, потому что это не намного более многословно и более понятно, что next
указывает на node
того же типа, но, тем не менее, и ваша версия в порядке:шаблон, когда вы используете имя класса без явного указания параметров шаблона, подразумевается, что они являются теми же, что и шаблон, который создается в данный момент.Это объясняется в §14.6.1 стандарта C ++:
В рамках шаблона класса, когда имя шаблона не является ни квалифицированным, ни сопровождаемым <, оно эквивалентно именишаблона, за которым следуют параметры шаблона, заключенные в <>.[Пример: конструктор для Set
может упоминаться как Set()
или Set<T>()
.] К другим специализациям (14.7.3) класса можно обратиться, явно указав имя шаблона с соответствующими аргументами шаблона.[Пример:
template<class T> class X {
X* p; // meaning X<T>
X<T>* p2;
X<int>* p3;
};
- конец примера]
Кстати, написание универсального списка - полезное упражнение для изучения языка, но имейте в виду, что многие стандартные контейнеры уже доступны в стандартной библиотеке C ++;Помимо того факта, что они прошли тщательное тестирование и оптимизацию, их абстракция «итераторов» позволяет вам использовать практически в любом контейнере автономные алгоритмы, доступные в библиотеке.