C ++で、(整数型の)非型テンプレートパラメーターの型のみが異なる、同じ名前の2つの関数/クラステンプレートが許可されないのはなぜですか?

デビッドストーン

これを試してみると、コンパイラはエラーを出します。VC ++とg ++の両方で試しました。

これは、関数テンプレートとクラステンプレートに等しく適用されます(ただし、関数テンプレートの場合、コンパイラエラーは、関数テンプレートがインスタンス化された場合にのみ発生します。クラステンプレートのコンパイラエラーは、コンパイラが2番目のクラス定義に遭遇するとすぐに発生します)。

関数テンプレートの例を次に示します。

template <unsigned int>
void Foo() {}

template <signed int>    // Same name, only difference is the type of the
void Foo() {}            // non-type template parameter (of integral type)

Foo<10U>(); // COMPILER ERROR.

上記で、コンパイラが単にインスタンス化できないのはなぜFoo&lt;unsigned int & gt;()ですか?

テンプレート関数/クラスの2番目のバージョンにタイプテンプレートパラメータがある場合、これは問題でないことがわかりましたテンプレート関数/クラスの2番目のバージョンに、整数型型テンプレートパラメータがある場合、問題にはなりません

template <unsigned int>
void Foo() {}

template <unsigned int*>  // Non-type template parameter
void Foo() {}             // of non-integral type

template <typename T>     // Type template parameter
void Foo() {}


Foo<10U>();               // OK

それで、私が推測しなければならなかったとしたら、それはコンパイラが整数型の値の間で変換できるという事実と関係があると思いますか?しかし、それはC ++がonintegralパラメーターのタイプによってのみ異なる2つのオーバーロード関数を許可することを妨げるものではありません。

StoryTeller-Unslander Monica

それはそれを可能にします、あなたは2つのテンプレートをうまく書くことができました。インスタンス化されると、使用できなくなります。その理由は、テンプレートを選択するための「過負荷解決」がないためです。非型テンプレート引数に課せられる唯一の要件は次のとおりです。

[temp.arg.nontype] / 2

非型テンプレートパラメータのテンプレート引数は、テンプレートパラメータの型の変換された定数式でなければなりません。

And10uは、intunsigned inttypeの両方の変換された定数式ですいずれかのオーバーロードの引数として有効です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ