4

私はこのなじみのない領域を突っついているので、この問題に関するDannyKalevのチュートリアルの簡単な例を試してみようと思いました。コードは非常に単純です。

template<> struct Count<> { static const int value = 0;};

template<typename T, typename... Args>
    struct Count<T, Args...> //partial specialization
{ 
    static const int value = 1 + Count<Args...>::value;
};

しかし、gcc 4.4.7および4.7.0でさえ(-std = c ++ 0x -std = gnu ++ 0xフラグにもかかわらず)次のように文句を言います。

/src/tests/VTemplates.h:12:8: error: 'Count' is not a template
/src/tests/VTemplates.h:12:18: error: explicit specialization of non-template 'Count'
/src/tests/VTemplates.h:16:8: error: 'Count' is not a template
/src/tests/VTemplates.h:16:26: error: 'Count' is not a template type

私は何が欠けていますか?

4

1 に答える 1

10
template<> struct Count<> { static const int value = 0;};

テンプレート引数のないテンプレートの特殊化です。ただし、まだ特殊化されていないテンプレートではないテンプレート クラスを特殊化することはできません。つまり、最初にテンプレート クラスの非特殊化バージョンを確立する必要があり、その後で初めてそれを特殊化できます。たとえば、次のようにします。

//non-specialized template
template<typename... Args>
struct Count;

//specialized version with no arguments
template<> struct Count<> { static const int value = 0;};

//another partial specialization
template<typename T, typename... Args>
struct Count<T, Args...> 
{ 
    static const int value = 1 + Count<Args...>::value;
};

それはうまくいくでしょう。

于 2012-04-21T00:21:25.933 に答える