4

私はC++ 11可変引数テンプレートを学習しており、テンプレート構造体を作成して、特定のリストの最大数を計算し、試しました:

#include <iostream>
#include <type_traits>

template <int a, int b, int... cs>
struct max: std::integral_constant<int, (a>b? max<a, cs...>::value: max<b, cs...>::value)> {};
template <int a, int b>
struct max<a, b>: std::integral_constant<int, (a>b? max<a>::value: max<b>::value)> {};
template <int a>
struct max<a>: std::integral_constant<int, a> {};

int main() {
  std::cout << max<2,1,5,7>::value << std::endl;
  return 0;
}

しかし、g ++は不平を言います:

test.cc:7:58: error: wrong number of template arguments (1, should be at least 2)
 struct max<a, b>: std::integral_constant<int, (a>b? max<a>::value : max<b>::value)> {};

test.cc:9:13: error: wrong number of template arguments (1, should be at least 2)
 struct max<a>: std::integral_constant<int, a> {};

事前に簡単な宣言を追加することで実行できます。

template <int...>
struct max;

上記の最初のテンプレートを次のように変更します。

template <int a, int b, int... cs>
struct max<a, b, cs...>: ...

私は cppreference: https://en.cppreference.com/w/cpp/language/partial_specialization#Partial_orderingを参照しまし たが、私の場合の有用な説明が見つかりません。

max<a>この問題は、テンプレート パラメータが 1 つしかない最後のテンプレート ( ) が原因である可能性があります。これは、プライマリ テンプレートの特別なバージョンではありません。

だから私の質問は:

max<a>マッチングできない理由は?これを扱う規則や基準はありますか?

================================================== ===============

わかりました、次のような C++ 標準 (文書番号 N4659) を見つけました。

[ 注: クラス テンプレートの部分的な特殊化は、プライマリ クラス テンプレートを検索し、そのテンプレートのすべての部分的な特殊化を検討することによって検出されます。using 宣言がクラス テンプレートに名前を付ける場合、using 宣言の後に導入された部分的な特殊化は、プライマリ テンプレートが表示されるため、効果的に表示されます (17.5.5)。— エンドノート]

したがって、通常のテンプレートから特殊化されていない形式の表現を生成できる場合もありますが、ベース/プライマリ テンプレートから特殊化されていない部分的に特殊化されたテンプレートはエラーと見なされると思います。

4

3 に答える 3