template<typename PixelType> struct Processor { static void proc(PixelType *p) { proc_inner<PixelType::HAS_COLOR>(p); } private: template<bool SUPPORTED_TYPE> static void proc_inner(PixelType *p) { // Do not anything. } template<> // Error static void proc_inner<true>(PixelType *p) { p->setRGB(1,0,0); } };
げー、これって二重の意味で規格違反だったのね。VCでは通るから自然に使ってた。クラススコープでtemplate<>と書けない(C++03 14.7.3)のと、外側のクラステンプレートを明示的に特殊化せずに、それに囲まれたクラスメンバテンプレートを明示的に特殊化してはならない(C++03 14.7.3/18)のと。
入れ子クラスの部分特殊化はできるのか……。うーん、面倒くさい。