1. ホーム
  2. c++

[解決済み] 非名前空間スコープでの明示的な特殊化 [重複].

2022-05-26 21:06:03

質問

template<typename T>
class CConstraint
{
public:
    CConstraint()
    {
    }

    virtual ~CConstraint()
    {
    }
    
    template <typename TL>
    void Verify(int position, int constraints[])
    {       
    }

    template <>
    void Verify<int>(int, int[])
    {   
    }
};

これをg++でコンパイルすると、以下のようなエラーが発生します。

名前空間でないスコープ 'class CConstraint' での明示的な特殊化

VCでは、問題なくコンパイルできます。どなたか回避策を教えていただけませんか?

どのように解決するのですか?

VC++ はこの場合、非準拠です。明示的な特殊化は、名前空間スコープでなければなりません。C++03, §14.7.3/2 :

明示的な特殊化は、テンプレートがメンバである名前空間、またはメンバテンプレートの場合は、包含するクラスまたは包含するクラステンプレートがメンバである名前空間で宣言されなければならない。

クラステンプレートのメンバ関数、メンバクラス又は静的データメンバの明示的な特殊化は、クラステンプレートがメンバである名前空間で宣言されなければならない。

さらに、C++03 により、含むクラスを明示的に特殊化することなくメンバ関数を特殊化できないという問題があります。 §14.7.3/3 のため、1 つの解決策として Verify() を、おそらく特殊な、自由関数に転送することです。

namespace detail {
    template <typename TL> void Verify     (int, int[]) {}
    template <>            void Verify<int>(int, int[]) {}
}

template<typename T> class CConstraint {
    // ...
    template <typename TL> void Verify(int position, int constraints[]) {
        detail::Verify<TL>(position, constraints);
    }
};