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)のと。
入れ子クラスの部分特殊化はできるのか……。うーん、面倒くさい。