template<typename T, typename P> struct TwoOptionTemplate {}; template<typename T> struct TwoOptionTemplate<T, char> { int member; }; template<typename T> struct TwoOptionTemplate<T, double> { float member; }; template<typename T> struct TwoOptionTemplate<T, T> { T** member; }; TwoOptionTemplate<int, char> X0; TwoOptionTemplate<int, double> X1; TwoOptionTemplate<void *, wchar_t> X2; TwoOptionTemplate<long, long> X3; TwoOptionTemplate<int, int> X4; TwoOptionTemplate<long, long> SingleDest; TwoOptionTemplate<int, double> SecondDoubleDest; template<int I, class C> struct IntTemplateSpec {}; template<class C> struct IntTemplateSpec<4, C> { C member; }; template<int I> struct IntTemplateSpec<I, void *> { double member; static constexpr int val = I; }; template<int I> struct IntTemplateSpec<I, double> { 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 T> class Parent {}; } // namespace Three } // namespace Two template<typename T, typename X> struct Child1: public Two::Three::Parent<unsigned> { char member; }; template<class T> struct Child1<T, One::Two::Three::Parent<T>> { T member; }; } // namespace One namespace Dst { One::Child1<double, One::Two::Three::Parent<double>> Z0Dst; } One::Child1<int, float> Z1;