Хорошо.Я объясняю вам проблему, с которой вы сталкиваетесь.Но первым делом первым.Вы сказали:
Я написал шаблонный класс, который выдает ошибку компиляции
Прежде всего, что касается C ++, такого не существуетв качестве «шаблона класса» существует только «шаблон класса». Способ чтения этой фразы - «шаблон для класса», а не «шаблон функции», который является «шаблоном дляфункция «.Опять же: классы не определяют шаблоны, шаблоны определяют классы (и функции). * Цитируется здесь .
Теперь давайте посмотрим на ошибку:
fatalошибка C1202: слишком сложный контекст зависимости рекурсивного типа или функции
Ошибка говорит сама за себя.$14.7.1
из Стандарта очень хорошо объясняет причину вашей проблемы, давая вам даже пример, очень близкий к тому, что вы делаете.Так что мне даже не нужно писать ни одного моего слова.Вот $14.7.1
4 Существует определенное реализацией количество, которое определяет ограничение на общую глубину рекурсивных реализаций , которое может включать более одного шаблона. Результат бесконечной рекурсии в экземпляре не определен. [Пример:
template < class T > class X {
X<T >* p; // OK
X<T*> a; //implicit generation of X<T> requires
//the implicit instantiation of X<T*> which requires
//the implicit instantiation of X<T**> which ...
};
- конец примера]
Прочитайте комментарий с X<T*> a
что в значительной степени относится и к вам.Таким образом, ваша проблема не из-за рекурсивной функции, а из-за рекурсивного создания шаблона класса , вызывающего из следующих строк:
Entity<T*> pPrev;
Entity<T*> pNext;
Надеюсь, это решит вашу проблему!
РЕДАКТИРОВАТЬ: Но мне интересно, что вы пытаетесь достичь с Entity<T*> pPrev
?Кажется, это опечатка, и вы, вероятно, хотели написать Entity<T>* pPrev
.То же самое с pNext
.Это так?
И совет по улучшению дизайна: используйте список инициализации элемента вместо назначения.То есть напишите свой конструктор следующим образом:
Entity<T>(const string & name, int size) : EntityName(name), EntitySize(size)
{
//all assignments moved to initialization list.
}
Прочитайте это: Почему я предпочитаю использовать список инициализации членов?