2009-04-07

メンバ関数の特殊化

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)のと。

入れ子クラスの部分特殊化はできるのか……。うーん、面倒くさい。