Веселые Шаблоны
От: chudo19  
Дата: 22.01.04 21:28
Оценка:
А почему так нельзя:
template<class T>
struct C
{  public:
   T a;    //error C<T>::a' uses undefined class 'A'     with   [   T=A  ]

};

class A:public C<A> 
{     
--SKIP--
};

А так можно:
template<class T>
struct C
{  public:
      void Do(void){T::Do();} //Можно

};

class A:public C<A> 
{     
static void Do(void){...}
};


Исправлено форматирование. Пожалуйста, пользуйтесь тегами [c] ... [/c], [code] ... [/code] и т.п. для выделения фрагментов кода. -- ПК.
Re: Веселые Шаблоны
От: a-lex Россия  
Дата: 22.01.04 23:10
Оценка: 30 (1)
Здравствуйте, chudo19, Вы писали:

C>А почему так нельзя:

C>template<class T>
C>struct C
C>{  public:
C>   T a;    //error C<T>::a' uses undefined class 'A'     with   [   T=A  ]
C>};

C>class A:public C<A> 
C>{     
C>--SKIP--
C>};

Потому что в этом примере ты пытаешься создать класс, содержащий в качестве члена сам себя. Подставь руками A вместо параметра шаблона, сразу все станет ясно. Это с точки зрения семантики приведенного примера. А с точки зрения компилятора, ошибка заключается в попытке объявить экземпляр (C::a) не полностью определенного класса (A), так как шаблон C<A> инстанцируется в точке, где определение класса A еще не завершено (а именно в списке его базовых классов).


C>А так можно:

C>template<class T>
C>struct C
C>{  public:
C>      void Do(void){T::Do();} //Можно
C>};

C>class A:public C<A> 
C>{     
C>static void Do(void){...}
C>};


А тут все хорошо: функции-члены шаблонного класса разворачиваются только в момент использования, поэтому при объявлении C::Do() компилятору все равно, есть ли у типа T функция Do() или нет (да он и не знает, что будет подставлено вместо типа T).
Re: Веселые Шаблоны
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 23.01.04 07:34
Оценка:
chudo19 wrote:

> А почему так нельзя:

> --SKIP--
>
> А так можно:
--SKIP--

Если неформально объяснять, то в первом случае бесконечная рекурсия
обнаруживается на этапе компиляции, а во втором, во время выполнения.
Естественно, компилятор должен не поддаться на бесконечный цикл, а до
рантайма ему дела мало (максимум warning).

--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[2]: Веселые Шаблоны
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 23.01.04 07:40
Оценка:
alnsn wrote:

>

> Если неформально объяснять, то в первом случае бесконечная рекурсия
> обнаруживается на этапе компиляции, а во втором, во время выполнения.
> Естественно, компилятор должен не поддаться на бесконечный цикл, а до
> рантайма ему дела мало (максимум warning).
Насчет рекурсии в рантайме я поторопился

--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.