C ++ CRTP виртуальная функция точка создания
Я пытаюсь понять, является ли стандартным простой шаблон CRTP.
Код ниже компилируется и работает как положено (на Clang).
Но мое понимание соответствующих стандартных глав / параграфов состоит в том, что точка создания виртуальной функции CRTP < Производный, База>:: DoSomething () должен находиться в точке (B) кода, где полное объявление Derived недоступно. Поэтому внутренний тип typedef также не должен быть доступен.
Может ли кто-нибудь указать на соответствующую стандартную главу, которая подтверждает этот код?
Другими словами, что-то, что говорит о том, что в этом случае виртуальная функция создается ATFER точка C? Заранее большое спасибо за понимание.
Francesco
//-------------------------
// START CODE
#include
struct Type1 {};
struct Type2 {};
struct Base
{
virtual ~Base() {}
virtual void DoSomething() = 0;
};
template< typename T, typename U >
struct CRTP : U
{
virtual void DoSomething() { DoSomething( typename T::Type() ); }
void DoSomething( Type1 ) { std::cout < "1\n"; }
void DoSomething( Type2 ) { std::cout < "2\n"; }
};
// (A) point of inst. of CRTP< Derived, Base > ( 14.7.1.4 ) ??
// (B) point of inst. of CRTP< Derived, Base >::DoSomething() (14.6.4.1.4 ) ??
struct Derived : CRTP< Derived, Base >
{
typedef Type2 Type;
};
// (C)
int main()
{
Base * ptr = new Derived;
ptr->DoSomething();
delete ptr;
}
// END CODE
//-------------------------