6

次のコンパイルはg++で問題なく行われます。

template<typename ReturnType = double, typename OtherType> ReturnType func(const OtherType& var)
{
    ReturnType result = 0;
    /* SOMETHING */
    return result;
}

すべての標準準拠コンパイラーが、デフォルトのテンプレートパラメーター(OtherTypeここ)の後にデフォルトではないテンプレートパラメーター(ここ)を持っていても大丈夫ReturnTypeですか?

4

1 に答える 1

10

それは複雑です。C++11 仕様から:

クラス テンプレートの template-parameter にデフォルトの template-argument がある場合、後続の各 template-parameter には、デフォルトの template-argument が提供されるか、テンプレート パラメータ パックのいずれかになります。プライマリ クラス テンプレートの template-parameter がテンプレート パラメーター パックである場合、それは最後の template-parameter でなければなりません。[ 注: これらは、テンプレート引数が推定できるため (14.8.2)、関数テンプレートまたはクラス テンプレートの部分的な特殊化の要件ではありません。

したがって、部分的な特殊化でない限り、あなたがしようとしていることはクラスには許可されていません。しかし、機能については大丈夫です。

例で示したように、関数を使用してこのトリックを実行している限り、問題ありません。それをクラス テンプレートに一般化することはできません。

于 2012-08-20T23:28:17.873 に答える