2

次のコードは機能しません。「構造体fooのテンプレート引数が少なすぎます」というエラーが表示され、その理由を理解できません。私にとっては、コードが有効であるように思えます。私はCPP参照hereの「引数リスト」の第4段落にあるスニペットを見つけましたが、それはなぜ機能しないのか分かりませんが、理解できません。非型引数の部分テンプレートの特殊化は許可されていません

template<int a, int b, int c> struct foo { }; 
template<int a> struct foo<a, 0, 0> { }; 

int main() 
{ 
    foo<1> f; 
} 

答えて

1

テンプレートの特殊化の仕組みではありません。 *すべての引数を指定する必要があります。 (。あなたはデフォルト引数(落語の答え@参照)、または時にC++ 17の引数控除がでキックが、両方が、ここでは適用されませんを持っている場合を除き)
*

ここで小さなデモです:

#include <iostream> 

template<int a, int b, int c> struct foo { void bar() {std::cout << "1\n";} }; 
template<int a> struct foo<a, 0, 0> { void bar() {std::cout << "2\n";} }; 

int main() 
{ 
    foo<1, 2, 3> a; 
    foo<4, 0, 0> b; 
    a.bar(); // prints 1 
    b.bar(); // prints 2 
} 
+0

私は参照してください。私の誤解は今明らかです。 – BananyaDev

4

これは許可されています。しかし、テンプレートには3つのパラメータが必要です。特殊化すれば、魔法のように1つのパラメータテンプレートに変わることはありません。

あなたは他のパラメータは、しかし、デフォルト引数を持たせることができます。プライマリテンプレートは3つのテンプレートパラメータを取ること

template<int a, int b = 0, int c = 0> struct foo { char _[1] ; }; 
template<int a> struct foo<a, 0, 0> { char _[10] ;}; 

int main() { 
    static_assert(sizeof(foo<1>) > sizeof(foo<1, 1, 1>), ""); 
    return 0; 
} 
+0

は、私は今のfoo <1>代わりにfooの<1, 0, 0>のようにそれを呼び出すことができる専門の考えではないですか? – BananyaDev

+0

@BananyaDev - いいえ。特殊化は、特定のパラメータセットの動作を制御することです。渡す必要のあるパラメータの数は変更されません。 – StoryTeller

+1

@BananyaDev - ただし、パラメータのデフォルトの引数を追加する機能があります。 – StoryTeller

1

注意。次に、それらのすべてを指定する必要があります。例えば

foo<1, 0, 0> f; // the partial specification is used 
関連する問題