0

私は C++ の初心者で、「C++ Primer Plus」という本を使って言語を独学し、プログラミングをより快適に行えるようにしています。

関数テンプレートのトピックに関連する本でいくつかの演習を行っていましたが、2 つの質問があります。

次の明示的な特殊化が機能しない理由がわかりません。

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


template <> 
box lesser<box>(box& a, box& b)
{
        return a.volume > b.volume? a : b;
}

タイプボックスの構造を持っていると仮定すると、タイプを「box&」タイプに特化できず、「ボックス」タイプに特化できないのはなぜですか? 2 番目の宣言は、「lesser() テンプレートを使用して関数定義を生成しないでください。代わりに、別の特殊な関数を使用してください」という意味です。それでも、type box& は使用できず、type box しか使用できません。何故ですか?

編集:わかりました、2番目の問題は自然に消えました。

4

3 に答える 3

3

Tすべてのインスタンスで同じタイプに特化する必要があります。

template <>
box& lesser<box&>(box& a, box& b)
{
    // ...
}

boxまたは、すべての場合に使用できます。


または、テンプレートを次のように変更することもできます。

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

そしてそれを次のように専門化します

template <>
box lesser(const box& a, const box& b)
{
        // ...
}
于 2012-09-07T21:14:40.677 に答える
3

テンプレートには、Tという1つのパラメーターしかありません。戻り値の型と引数の型は同じである必要があります。ただし、スペシャライゼーションは参照によってパラメーターを受け取り、値によって返します。これは2つの異なるタイプであるため、テンプレートとスペシャライゼーションは一致しません。

于 2012-09-07T21:14:50.730 に答える
1

専門分野がテンプレートと一致しません。テンプレートは、値によって2つのオブジェクトを受け取る関数を想定しており、同じタイプのオブジェクトを返します。特殊化は、2つのボックスオブジェクト参照を受け取り、ボックスオブジェクトを返す関数です。

ああ、それが削除される前に、すべてのものがうまく一致しているので、2番目の例はこれを示しています。それに戻って、これと比較してください。

于 2012-09-07T21:13:49.263 に答える