187aa9c9eSJonas Devlieghere namespace N0 { 287aa9c9eSJonas Devlieghere namespace N1 { 387aa9c9eSJonas Devlieghere 487aa9c9eSJonas Devlieghere namespace { 587aa9c9eSJonas Devlieghere enum Enum { Enum_0 = 1, Enum_1 = 2, Enum_2 = 4, Enum_3 = 8 }; 6*895529cfSAleksandr Urakov enum class ScopedEnum { Enum_0 = 1, Enum_1 = 2, Enum_2 = 4, Enum_3 = 8 }; 787aa9c9eSJonas Devlieghere } 887aa9c9eSJonas Devlieghere 987aa9c9eSJonas Devlieghere Enum Global = Enum_3; 1087aa9c9eSJonas Devlieghere 1187aa9c9eSJonas Devlieghere struct Base { 1287aa9c9eSJonas Devlieghere Enum m_e = Enum_1; 1387aa9c9eSJonas Devlieghere }; 1487aa9c9eSJonas Devlieghere 1587aa9c9eSJonas Devlieghere class Class : public Base { 1687aa9c9eSJonas Devlieghere public: Class(Enum e)1787aa9c9eSJonas Devlieghere Class(Enum e) : m_ce(e) {} 1887aa9c9eSJonas Devlieghere StaticFunc(const Class & c)1987aa9c9eSJonas Devlieghere static int StaticFunc(const Class &c) { 2087aa9c9eSJonas Devlieghere return c.PrivateFunc(c.m_inner) + Global + ClassStatic; 2187aa9c9eSJonas Devlieghere } 2287aa9c9eSJonas Devlieghere 2387aa9c9eSJonas Devlieghere const Enum m_ce; 2487aa9c9eSJonas Devlieghere 2587aa9c9eSJonas Devlieghere static int ClassStatic; 26*895529cfSAleksandr Urakov static const int ClassStaticConst = 8; 27*895529cfSAleksandr Urakov static constexpr int ClassStaticConstexpr = 9; 28*895529cfSAleksandr Urakov static constexpr float ClassStaticConstexprFloat = 10.f; 29*895529cfSAleksandr Urakov static constexpr double ClassStaticConstexprDouble = 11.0; 30*895529cfSAleksandr Urakov static constexpr long double ClassStaticConstexprLongDouble = 12.0; 31*895529cfSAleksandr Urakov static const Enum ClassStaticConstEnum = Enum_3; 32*895529cfSAleksandr Urakov static const ScopedEnum ClassStaticConstScopedEnum = ScopedEnum::Enum_2; 3387aa9c9eSJonas Devlieghere 3487aa9c9eSJonas Devlieghere private: 3587aa9c9eSJonas Devlieghere struct Inner { 3687aa9c9eSJonas Devlieghere char x; 3787aa9c9eSJonas Devlieghere short y; 3887aa9c9eSJonas Devlieghere int z; 3987aa9c9eSJonas Devlieghere }; 4087aa9c9eSJonas Devlieghere PrivateFunc(const Inner & i) const4187aa9c9eSJonas Devlieghere int PrivateFunc(const Inner &i) const { return i.z; } 4287aa9c9eSJonas Devlieghere 4387aa9c9eSJonas Devlieghere Inner m_inner{}; 4487aa9c9eSJonas Devlieghere }; 4587aa9c9eSJonas Devlieghere int Class::ClassStatic = 7; 4687aa9c9eSJonas Devlieghere 4787aa9c9eSJonas Devlieghere template<typename T> 4887aa9c9eSJonas Devlieghere struct Template { 4987aa9c9eSJonas Devlieghere template<Enum E> TemplateFuncN0::N1::Template5087aa9c9eSJonas Devlieghere void TemplateFunc() { 5187aa9c9eSJonas Devlieghere T::StaticFunc(T(E)); 5287aa9c9eSJonas Devlieghere } 5387aa9c9eSJonas Devlieghere }; 5487aa9c9eSJonas Devlieghere foo()5587aa9c9eSJonas Devliegherevoid foo() { Template<Class>().TemplateFunc<Enum_0>(); } 5687aa9c9eSJonas Devlieghere 5787aa9c9eSJonas Devlieghere } // namespace N1 5887aa9c9eSJonas Devlieghere } // namespace N0 5987aa9c9eSJonas Devlieghere main()6087aa9c9eSJonas Devlieghereint main() { 6187aa9c9eSJonas Devlieghere N0::N1::foo(); 6287aa9c9eSJonas Devlieghere return 0; 6387aa9c9eSJonas Devlieghere } 64