0

次のコードがあると、2番目fooが部分的な特殊化と見なされ、後者がそうではない理由が少し混乱しています(IMOは両方とも部分的であってはなりません)。

template <bool IS_TRUE>
int foo();

// Doesn't work!?
template <bool IS_TRUE>
int foo<IS_TRUE>() {
    return 0;
}

template <>
int foo<true>() {
    return 0;
}

int main() {
    return foo<true>();
}

2番目のfoogccで不平を言う:

エラー: 関数テンプレートの部分的な特殊化 'foo' は許可されていません

誰かが説明してくれませんか、私が見逃している詳細を教えてください。

4

1 に答える 1

0

名前の後にテンプレート引数がある構文は、部分的な特殊化のために予約されています。

template<typename T> struct foo {};
template<typename T> struct foo<T *> {};

部分的な特殊化が引数の特殊化に失敗した場合、次のようなエラーが発生します。

template<typename T> struct foo {};
template<typename T> struct foo<T> {};
error: partial specialization 'foo<T>' does not specialize any template arguments

関数テンプレートでは部分的な特殊化は許可されていません (代わりにオーバーロードを使用してください)。したがって、特殊化が実際にテンプレート引数を特殊化するかどうかをコンパイラがチェックしても意味がありません。いずれにせよ違法です。関数の宣言と定義を分離している場合は、宣言と定義の両方でテンプレート引数を省略してください。

template<bool IS_TRUE> int foo();
template<bool IS_TRUE> int foo() { return 0; }
template<> int foo<true>() { return 0; }
于 2013-03-20T08:24:59.600 に答える