Why can a dependent name be considered as complete even if the actual type is not defined until the very end
问题 Consider this example: template <class T> void Yeap(T); int main() { Yeap(0); return 0; } template <class T> void YeapImpl(); struct X; template <class T> void Yeap(T) { YeapImpl<X>(); // pass X to another template } template <class T> void YeapImpl() { T().foo(); } struct X { void foo() {} }; Note that struct X is not defined until the very end. I used to believe that all odr-used names must be complete at the point of the instantiation. But here, how can the compiler treat it as a complete