1*0333dd95SReid Kleckner template<typename T, typename P> 2*0333dd95SReid Kleckner struct TwoOptionTemplate {}; 3*0333dd95SReid Kleckner 4*0333dd95SReid Kleckner template<typename T> 5*0333dd95SReid Kleckner struct TwoOptionTemplate<T, char> { 6*0333dd95SReid Kleckner int member; 7*0333dd95SReid Kleckner }; 8*0333dd95SReid Kleckner 9*0333dd95SReid Kleckner 10*0333dd95SReid Kleckner template<typename T> 11*0333dd95SReid Kleckner struct TwoOptionTemplate<T, double> { 12*0333dd95SReid Kleckner float member; 13*0333dd95SReid Kleckner }; 14*0333dd95SReid Kleckner 15*0333dd95SReid Kleckner template<typename T> 16*0333dd95SReid Kleckner struct TwoOptionTemplate<T, T> { 17*0333dd95SReid Kleckner T** member; 18*0333dd95SReid Kleckner }; 19*0333dd95SReid Kleckner 20*0333dd95SReid Kleckner TwoOptionTemplate<int, char> X0; 21*0333dd95SReid Kleckner TwoOptionTemplate<int, double> X1; 22*0333dd95SReid Kleckner TwoOptionTemplate<void *, wchar_t> X2; 23*0333dd95SReid Kleckner TwoOptionTemplate<long, long> X3; 24*0333dd95SReid Kleckner TwoOptionTemplate<int, int> X4; 25*0333dd95SReid Kleckner TwoOptionTemplate<long, long> SingleDest; 26*0333dd95SReid Kleckner TwoOptionTemplate<int, double> SecondDoubleDest; 27*0333dd95SReid Kleckner 28*0333dd95SReid Kleckner 29*0333dd95SReid Kleckner template<int I, class C> 30*0333dd95SReid Kleckner struct IntTemplateSpec {}; 31*0333dd95SReid Kleckner 32*0333dd95SReid Kleckner template<class C> 33*0333dd95SReid Kleckner struct IntTemplateSpec<4, C> { 34*0333dd95SReid Kleckner C member; 35*0333dd95SReid Kleckner }; 36*0333dd95SReid Kleckner 37*0333dd95SReid Kleckner template<int I> 38*0333dd95SReid Kleckner struct IntTemplateSpec<I, void *> { 39*0333dd95SReid Kleckner double member; 40*0333dd95SReid Kleckner static constexpr int val = I; 41*0333dd95SReid Kleckner }; 42*0333dd95SReid Kleckner 43*0333dd95SReid Kleckner template<int I> 44*0333dd95SReid Kleckner struct IntTemplateSpec<I, double> { 45*0333dd95SReid Kleckner char member; 46*0333dd95SReid Kleckner static constexpr int val = I; 47*0333dd95SReid Kleckner }; 48*0333dd95SReid Kleckner 49*0333dd95SReid Kleckner IntTemplateSpec<4, wchar_t>Y0; 50*0333dd95SReid Kleckner IntTemplateSpec<5, void *> Y1; 51*0333dd95SReid Kleckner IntTemplateSpec<1, int> Y2; 52*0333dd95SReid Kleckner IntTemplateSpec<2, int> Y3; 53*0333dd95SReid Kleckner IntTemplateSpec<43, double> NumberDest; 54*0333dd95SReid Kleckner 55*0333dd95SReid Kleckner namespace One { 56*0333dd95SReid Kleckner namespace Two { 57*0333dd95SReid Kleckner namespace Three { 58*0333dd95SReid Kleckner 59*0333dd95SReid Kleckner template<class T> 60*0333dd95SReid Kleckner class Parent {}; 61*0333dd95SReid Kleckner 62*0333dd95SReid Kleckner } // namespace Three 63*0333dd95SReid Kleckner 64*0333dd95SReid Kleckner } // namespace Two 65*0333dd95SReid Kleckner 66*0333dd95SReid Kleckner template<typename T, typename X> 67*0333dd95SReid Kleckner struct Child1: public Two::Three::Parent<unsigned> { 68*0333dd95SReid Kleckner char member; 69*0333dd95SReid Kleckner }; 70*0333dd95SReid Kleckner 71*0333dd95SReid Kleckner template<class T> 72*0333dd95SReid Kleckner struct Child1<T, One::Two::Three::Parent<T>> { 73*0333dd95SReid Kleckner T member; 74*0333dd95SReid Kleckner }; 75*0333dd95SReid Kleckner 76*0333dd95SReid Kleckner } // namespace One 77*0333dd95SReid Kleckner 78*0333dd95SReid Kleckner namespace Dst { One::Child1<double, One::Two::Three::Parent<double>> Z0Dst; } 79*0333dd95SReid Kleckner One::Child1<int, float> Z1; 80