6

次のように、特殊化する必要があるテンプレート メンバー関数を持つテンプレート クラスがあります。

template <typename T>
class X
{
public:
    template <typename U>
    void Y() {}

    template <>
    void Y<int>() {}
};

VCはこれを正しく処理しますが、明らかにこれは標準ではなく、GCCは不平を言います:explicit specialization in non-namespace scope 'class X<T>'

私は試した:

template <typename T>
class X
{
public:
    template <typename U>
    void Y() {}
};

template <typename T>
// Also tried `template<>` here
void X<T>::Y<int>() {}

しかし、これにより VC と GCC の両方が文句を言います。

これを行う正しい方法は何ですか?

4

2 に答える 2

9

非常に一般的な問題。それを解決する1つの方法は、オーバーロードすることです

template <typename T>
struct type2type { typedef T type; };

template <typename T>
class X
{
public:
    template <typename U>
    void Y() { Y(type2type<U>()); }

private:
    template<typename U>
    void Y(type2type<U>) { }

    void Y(type2type<int>) { }
};
于 2010-06-14T19:22:24.567 に答える