Однако, похоже, что производный класс не требует определения для компиляции, поскольку он наследует один (, код компилируется нормально без определения my_type :: foo).
C ++ ленив: не будет пытаться сделать базу:: foo (), если вы на самом деле не используете его.Но если вы попытаетесь использовать его, он будет создан, а если это не удастся, ошибки компиляции будут появляться.Но в твоем случае база:: foo () может быть запущен просто отлично:
template <class Derived>
struct base {
void foo() {
static_cast<Derived *>(this)->foo();
};
};
struct my_type : base<my_type> {};
void func() {
my_type m;
static_cast<base<my_type>& >(m).foo();
}
прекрасно скомпилируется.Когда компилятору предоставляется static_cast (this) -> foo (), он пытается найти функцию foo (), которая доступна в my_type.И есть один: он называется базовым:: foo (), который является открытым от публично унаследованного класса.так база:: foo () вызывает базу:: foo (), и вы получите бесконечную рекурсию.