5

パラメータがすべてわかっている場合、内部テンプレートを特殊化するのに問題があります。次に例を示します。

template < typename T0 >
struct outer
{
    template < typename T1 = void, typename T2 = void >
    struct inner
    {
        typedef T1 type;
    };
};
template < typename T0 >
template < typename T1 >
struct outer<T0>::inner<double,T1> { typedef int type; };

これはうまくいきます。代わりに内部テンプレートをそのように指定すると、次のようにはなりません:

template < typename T0 >
template < >
struct outer<T0>::inner<double,void> { typedef int type; };

このため、「「>」トークンの前の明示的な特殊化が無効です...囲んでいるクラステンプレートは明示的に特殊化されていません...部分的な特殊化で使用されていないテンプレートパラメーター:...T0」というエラーメッセージが表示されます。ここで WTAF が行われているかどうかはわかりません。

私もこれを試しました:

template < typename T0 >
struct outer<T0>::inner<double,void> { typedef int type; };

これは失敗すると予想していましたが、エラー メッセージは驚くべきものではありません。それは「テンプレートパラメータリストが少なすぎる」でした。

それで、これを行う正しい方法は何ですか?もちろん、ハッキングすることもできますが、その必要がなければ、したくありません。

4

1 に答える 1

7

それは許されません。それ自体が完全に特殊化されていないクラス テンプレートのメンバーを完全に特殊化することはできません。

C++11 標準のパラグラフ 14.7.16 によると:

クラス テンプレートのメンバーまたは名前空間スコープに表示されるメンバー テンプレートの明示的な特殊化宣言では、メンバー テンプレートとその外側のクラス テンプレートの一部は、特殊化されていないままになる場合があります。囲んでいるクラス テンプレートも明示的に特殊化されていません。[...]

また、C++11 標準の段落 14.7.3/15 には次のように記載されています。

メンバーまたはメンバー テンプレートは、多くの囲んでいるクラス テンプレート内に入れ子にすることができます。このようなメンバーの明示的な特殊化では、メンバー宣言の前に、明示的に特殊化されたtemplate<>for each を囲むクラス テンプレートが必要です。【

template<class T1> class A {
     template<class T2> class B {
         void mf();
     };
};
template<> template<> class A<int>::B<double>;
template<> template<> void A<char>::B<char>::mf();

—<em>例の終了]

于 2013-06-16T02:10:01.857 に答える