А почему так нельзя:
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] и т.п. для выделения фрагментов кода. -- ПК.
Здравствуйте, 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).
chudo19 wrote:
> А почему так нельзя:
> --SKIP--
>
> А так можно:
--SKIP--
Если неформально объяснять, то в первом случае бесконечная рекурсия
обнаруживается на этапе компиляции, а во втором, во время выполнения.
Естественно, компилятор должен не поддаться на бесконечный цикл, а до
рантайма ему дела мало (максимум warning).
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
alnsn wrote:
>
> Если неформально объяснять, то в первом случае бесконечная рекурсия
> обнаруживается на этапе компиляции, а во втором, во время выполнения.
> Естественно, компилятор должен не поддаться на бесконечный цикл, а до
> рантайма ему дела мало (максимум warning).
Насчет рекурсии в рантайме я поторопился
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta