5

テンプレート パラメータの宣言が必要な場合 (typename以下classで提案する diff 構文で language could not work のように) 。テンプレートのパラメーターが整数になる可能性があることはわかっているため、デフォルトで int またはtypename/ class を選択する必要がありますが、それでもなお.

つまり、なぜですか

template <T>
T max(T a, T b) {
    return a > b ? a : b;
}

それ以外の

template <typename T>
T max(T a, T b) {
    return a > b ? a : b;
}

template<T, size_t n>
size_t array_size(const T (&)[n]) {
    return n;
}

それ以外の

template<typename T, size_t n>
size_t array_size(const T (&)[n]) {
    return n;
}
4

2 に答える 2

8

テンプレートのパラメーターがデフォルトで型になっている場合でも、言語は確実に機能します。int型指定子がない場合に変数の型がデフォルトになったときに C が機能していたのと同じように。克服すべきいくつかのあいまいさがあります。たとえば、次のようになります。

typedef int T;
template <T> class C;  // type, or non-type value of type `T`?

ただし、明示的にすることを強制すると、はるかに優れた診断が可能になります。非型パラメータの型を指定するのを忘れた場合、コンパイラはすぐに間違いを見つけて教えてくれます。あなたの世界では、私が型パラメーターを意図していると想定し、それに応じてテンプレートを解釈しようとします。おそらく紛らわしいエラーを生成するか、完全に間違ったことを行うものをコンパイルすることに成功することさえあります.

それがここでデフォルトを許可しない理由 (または C からデフォルトの変数型を削除する理由、または C++ で決して許可しない理由) であるかどうかについてコメントすることはできませんが、それは確かに私にとって十分な理由です。

于 2013-01-29T18:43:20.467 に答える
-1

テンプレート パラメーターの型は、さまざまなものになる可能性があります。typename実際には最も一般的ですが、指定する必要があります。typenameタイプが指定されていない場合、言語はあなたが意図していると想定できたと思いますが、そのように指定しませんでした。

于 2013-01-29T18:37:11.707 に答える