1 namespace N0 { 2 namespace N1 { 3 4 namespace { 5 enum Enum { Enum_0 = 1, Enum_1 = 2, Enum_2 = 4, Enum_3 = 8 }; 6 enum class ScopedEnum { Enum_0 = 1, Enum_1 = 2, Enum_2 = 4, Enum_3 = 8 }; 7 } 8 9 Enum Global = Enum_3; 10 11 struct Base { 12 Enum m_e = Enum_1; 13 }; 14 15 class Class : public Base { 16 public: Class(Enum e)17 Class(Enum e) : m_ce(e) {} 18 StaticFunc(const Class & c)19 static int StaticFunc(const Class &c) { 20 return c.PrivateFunc(c.m_inner) + Global + ClassStatic; 21 } 22 23 const Enum m_ce; 24 25 static int ClassStatic; 26 static const int ClassStaticConst = 8; 27 static constexpr int ClassStaticConstexpr = 9; 28 static constexpr float ClassStaticConstexprFloat = 10.f; 29 static constexpr double ClassStaticConstexprDouble = 11.0; 30 static constexpr long double ClassStaticConstexprLongDouble = 12.0; 31 static const Enum ClassStaticConstEnum = Enum_3; 32 static const ScopedEnum ClassStaticConstScopedEnum = ScopedEnum::Enum_2; 33 34 private: 35 struct Inner { 36 char x; 37 short y; 38 int z; 39 }; 40 PrivateFunc(const Inner & i) const41 int PrivateFunc(const Inner &i) const { return i.z; } 42 43 Inner m_inner{}; 44 }; 45 int Class::ClassStatic = 7; 46 47 template<typename T> 48 struct Template { 49 template<Enum E> TemplateFuncN0::N1::Template50 void TemplateFunc() { 51 T::StaticFunc(T(E)); 52 } 53 }; 54 foo()55void foo() { Template<Class>().TemplateFunc<Enum_0>(); } 56 57 } // namespace N1 58 } // namespace N0 59 main()60int main() { 61 N0::N1::foo(); 62 return 0; 63 } 64