Q: デフォルトのテンプレート引数がクラス テンプレートにのみ許可されるのはなぜですか?メンバー関数テンプレートでも同様に使用できないのはなぜですか?
例:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
C によれば、デフォルトのテンプレート引数はクラス テンプレートに対してのみ有効です。
A: デフォルトのテンプレート引数は確かに便利です。ソート関数について考えてみましょう。
<code class="cpp">template<typename Iterator, typename Comp = std::less< typename std::iterator_traits<Iterator>::value_type>> void sort(Iterator beg, Iterator end, Comp c = Comp()) { ... }</code>
ただし、C における現在の制限の理論的根拠は、独立した関数がそれほど重要ではないと考えられていた言語の初期の時代に根ざしています。その結果、デフォルト値の使用を妨げて、関数の引数からすべてのテンプレート引数を推定する必要がありました。
この制限により、コードの柔軟性とメンバー関数テンプレートとの互換性が妨げられます。これを修正するために、C 0x は関数テンプレートのデフォルトのテンプレート引数を導入しました。
C の作成者である Bjarne Stroustrup 氏は欠陥レポートで次のように述べています。
「デフォルトのテンプレートの禁止」関数テンプレートの引数は、独立した関数が二級市民として扱われ、すべてのテンプレート引数を指定するのではなく関数の引数から推定する必要があった時代の誤った名残です。"
"この制限はプログラミング スタイルを著しく窮屈にします。メンバー関数とは異なる独立した関数を不必要に作成することで、STL スタイルのコードを書くことが難しくなります。"
以上がデフォルトのテンプレート引数が C のクラス テンプレートにのみ許可されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。