#include "cxx-templates-common.h" namespace hidden_specializations { // explicit specializations template<> void fn() {} template<> struct cls { void nested_fn(); struct nested_cls; static int nested_var; enum nested_enum : int; }; template<> int var; // partial specializations template struct cls { void nested_fn(); struct nested_cls; static int nested_var; enum nested_enum : int; }; template int var; // member specializations template<> void cls::nested_fn() {} template<> struct cls::nested_cls {}; template<> int cls::nested_var; template<> enum class cls::nested_enum { e }; template<> template void cls::nested_fn_t() {} template<> template struct cls::nested_cls_t {}; template<> template int cls::nested_var_t; // specializations instantiated here are ok if their pattern is inline void use_stuff() { fn(); cls(); (void)var; cls(); (void)var; cls::nested_fn_t(); cls::nested_cls_t(); (void)cls::nested_var_t; } }