Я полагаю, что Ваше исходное предположение было корректно, я нашел, что это обычная практика для некоторых языков для добавления префикса подчеркивания к методам/участникам и т.д., которые предназначены, чтобы быть сохраненными частными к "объекту". Просто визуальный способ сказать, хотя Вы можете, Вы не должны называть это!
В вашем форвардном объявлении говорится, что llist
- это класс:
class llist;
Затем вы говорите, что это шаблон:
template<typename T>
class llist;
Аналогично iter
.
Я не знаю, как можно легко сделать его компилируемым. Однако вы можете сделать узел
и iter
«внутри» llist
.
Есть несколько проблем.
class A;
- это не способ пересылки объявления шаблонного класса.
Если A имеет единственный шаблонный параметр, вам нужно сказать:
template<typename T>
class A;
Если вы говорите что после того, как вы уже сказали class A;
, вы противоречите себе. Следующая проблема - simlar, friend class A;
если шаблон A не будет работать, вам нужно сказать friend class A
или подобное. Наконец, static_cast
не будет компилироваться (хотя static_cast
будет, но все равно не хочет, чтобы вы хочу). Чтобы осмысленно преобразовать строку в целое число, вам необходимо использовать atoi
, strtol
, stringstream
и т. Д.
Список не является классом. Так что предварительное объявление этого бесполезно.
template<typename T> class llist;
Попытаться скомпилировать код относительно просто.
Вы только что пропустили часть шаблона для многих типов. Найдите iter llist и node и убедитесь, что в конце они указаны подходящие.
Если вы посмотрите на STL, для простоты использования типично определить некоторые внутренние типы. Вы можете следовать тому же принципу.
template<typename T>
class llist
{
typedef iter<T> Iter;
typedef node<T> Node;
// The rest of the code.
};