Почему шаблоны допускают типы методов незаконченных классов?

Почему шаблоны позволяют обходить неполные типы?
Я следовал примеру из учебника по узлам, связанным спискам и итераторам. Я заметил, что он использовал указатель на экземпляры списков и узлов в классе Iterator, но затем он также создал метод в классе List для возврата Iterator для этого класса. Когда я попытался реализовать это сам, чтобы сэкономить время, я не шаблонировал его и вместо этого выбрал int data, однако я получил ошибку неполного типа для моего метода с типом итератора. Когда я следовал шаблонной нотации, она работала нормально.

template<class Datatype> class Object;
template<class Datatype> class List;
template<class Datatype> class Helper;

template <class Datatype>
class Object {
public:
Object() : m_data(), next(0) {}
Datatype m_data;
Object<Datatype>* next;
};

template <class Datatype>
class List{
public:
List() : m_head(0), m_tail(0) {}
Object<Datatype>* m_head;
Object<Datatype>* m_tail;
int m_count;
Helper<Datatype> getHelper()
{
return Helper<Datatype>( m_head, this);
}
};
template <class Datatype>
class Helper {
public:
Helper( Object<Datatype>* p_node, List<Datatype>* p_list);
Object<Datatype>* m_node;
List<Datatype>* m_list;

};

редактировать: Возможно, была некоторая путаница с тем, о чем говорил мой вопрос. Он имел в виду метод с типом класса

Helper<Datatype> getHelper()

При жестком вводе это приводит к ошибке неполного типа. Мне было интересно, как шаблоны обошли это? У меня есть идея, что это потому, что шаблон допускает типы памяти разного размера, тогда он не обрабатывает эти методы, возвращая размер памяти до момента компиляции. Мне довольно любопытно, как это работает, если у кого-то есть ответ, я буду признателен.

-1

Решение

Строки 1-3 в коде, который вы опубликовали, объявляют вперед все ваши классы, поэтому указатели на их экземпляры теперь могут быть разрешены компилятором до того, как он увидит полное определение.

Та же самая техника работает в не шаблонном случае.

Изменить после обновления ОП:
В не шаблонных классах, чтобы использовать реальный объект (в отличие от просто указателя), вам необходимо иметь полное определение класса. Таким образом, предварительных объявлений недостаточно, и при попытке вернуть экземпляр Helper вы получите ошибку.

Шаблоны не создаются до тех пор, пока вы их не используете, что в вашем случае происходит после того, как вы предоставили полное определение Helper, поэтому у компилятора не возникнет проблем с его поиском.

0

Другие решения