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 } 7 8 Enum Global = Enum_3; 9 10 struct Base { 11 Enum m_e = Enum_1; 12 }; 13 14 class Class : public Base { 15 public: 16 Class(Enum e) : m_ce(e) {} 17 18 static int StaticFunc(const Class &c) { 19 return c.PrivateFunc(c.m_inner) + Global + ClassStatic; 20 } 21 22 const Enum m_ce; 23 24 static int ClassStatic; 25 26 private: 27 struct Inner { 28 char x; 29 short y; 30 int z; 31 }; 32 33 int PrivateFunc(const Inner &i) const { return i.z; } 34 35 Inner m_inner{}; 36 }; 37 int Class::ClassStatic = 7; 38 39 template<typename T> 40 struct Template { 41 template<Enum E> 42 void TemplateFunc() { 43 T::StaticFunc(T(E)); 44 } 45 }; 46 47 void foo() { Template<Class>().TemplateFunc<Enum_0>(); } 48 49 } // namespace N1 50 } // namespace N0 51 52 int main() { 53 N0::N1::foo(); 54 return 0; 55 } 56