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 SingleSource; TwoOptionTemplate SecondDoubleSource; template struct IntTemplateSpec {}; template struct IntTemplateSpec<4, C> { C member; }; template struct IntTemplateSpec { int 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, long> Y2; IntTemplateSpec<3, int> Y3; //template constexpr int IntTemplateSpec::val; IntTemplateSpec<42, double> NumberSource; static_assert(NumberSource.val == 42); namespace One { namespace Two { // Just an empty namespace to ensure we can deal with multiple namespace decls. } } 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 One::Child1 Z0Source; // Test import of nested namespace specifiers template struct Outer { template class Inner0; }; template template class Outer::Inner0 { public: void f(X, Y); template struct Inner1; }; template template void Outer::Inner0::f(X, Y) {} template template template class Outer::Inner0::Inner1 { public: void f(Y, Z); }; template template template void Outer::Inner0::Inner1::f(Y, Z) {}