Проблема, с которой вы сейчас сталкиваетесь, заключается в том, что вы list.cpp
не включают вас list.h
: компилятор видит пару определений для вещей, которые еще не объявлены. Вы можете решить эту проблему, добавив list.h
вверху вашего файла:
#include "list.h"
...
Однако это, по сути, приведет к возникновению проблемы: если вы действительно хотите использовать ваш List<T>
с каким-либо типом, компилятору необходимо увидеть определение шаблона, в котором используется шаблон класса. То есть, как правило, вы будете реализовывать свои шаблоны в заголовочном файле. Альтернативой является реализация шаблонов в файле реализации и явное создание экземпляров типов, с которыми он будет использоваться. Это вполне разумно для некоторых шаблонов, но для чего-то, предназначенного для использования с неизвестным количеством типов, это не практично.
Кстати, вы используете имена, к которым вы не имеете права прикасаться: имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква, зарезервированы для реализации C ++, то есть компилятора и стандартной библиотеки. Имена, использующие два последовательных подчеркивания в любом месте, также зарезервированы.