template struct TwoOptionTemplate {}; template struct TwoOptionTemplate { int member; }; template struct TwoOptionTemplate { float member; }; template struct TwoOptionTemplate { T** member; }; TwoOptionTemplate X0; TwoOptionTemplate X1; TwoOptionTemplate X2; TwoOptionTemplate X3; TwoOptionTemplate X4; TwoOptionTemplate SingleDest; TwoOptionTemplate SecondDoubleDest; template struct IntTemplateSpec {}; template struct IntTemplateSpec<4, C> { C member; }; template struct IntTemplateSpec { double member; static constexpr int val = I; }; template struct IntTemplateSpec { char member; static constexpr int val = I; }; IntTemplateSpec<4, wchar_t>Y0; IntTemplateSpec<5, void *> Y1; IntTemplateSpec<1, int> Y2; IntTemplateSpec<2, int> Y3; IntTemplateSpec<43, double> NumberDest; namespace One { namespace Two { namespace Three { template class Parent {}; } // namespace Three } // namespace Two template struct Child1: public Two::Three::Parent { char member; }; template struct Child1> { T member; }; } // namespace One namespace Dst { One::Child1> Z0Dst; } One::Child1 Z1;