4

他のテンプレートと同じように変数テンプレートを使用しようとしていました。たとえば、静的値または列挙値をラップするテンプレート オブジェクトを使用したメタプログラミングを使用して、フィボナッチ数または数のべき乗を計算する方法は既にわかっています。

そのため、最初にテンプレート変数を特殊化しようとしましたが、期待どおりに機能します。

template <std::size_t VALUE> std::size_t value       = VALUE;
template <>                  std::size_t value<666u> = 1u;

std::cout << value<0u> << '\n';   // "0" as expected
std::cout << value<1u> << '\n';   // "1" as expected
std::cout << value<2u> << '\n';   // "2" as expected
std::cout << value<666u> << '\n'; // "1" as expected!!

変数テンプレートの特殊化が可能であることを知っているので、変数テンプレートのフィボナッチ数を実行しようとしました:

template <std::size_t ITERATION>
std::size_t fibonacci = fibonacci<ITERATION - 1u> + fibonacci<ITERATION - 2u>;
template <> std::size_t fibonacci<1u> = 1u;
template <> std::size_t fibonacci<0u> = 0u;

int main()
{
    std::cout << fibonacci<5> << '\n'; // "8" expected;
    return 0;
}

Wandboxから取得したエラーは次のとおりです。

error: expected primary-expression before ';' token
template <std::size_t ITERATION> std::size_t fibonacci = fibonacci<ITERATION - 1u> + fibonacci<ITERATION - 2u>;
                                                                                                              ^

何が間違っているのか、エラーを理解していないのかわかりません。エラーは、変数テンプレートを既に使用している間にまだ定義されていないという事実に関連している可能性があると推測しているため、変数テンプレートで目標を達成することさえ可能かどうか疑問に思っています。

ヒントはありますか?

どうもありがとう。

4

1 に答える 1