これを試してみると、コンパイラはエラーを出します。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<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つのオーバーロード関数を許可することを妨げるものではありません。
それはそれを可能にします、あなたは2つのテンプレートをうまく書くことができました。インスタンス化されると、使用できなくなります。その理由は、テンプレートを選択するための「過負荷解決」がないためです。非型テンプレート引数に課せられる唯一の要件は次のとおりです。
非型テンプレートパラメータのテンプレート引数は、テンプレートパラメータの型の変換された定数式でなければなりません。
And10u
は、int
とunsigned int
typeの両方の変換された定数式です。いずれかのオーバーロードの引数として有効です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加