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