КодРекурсивные шаблоны не работают, как ожидается, со статическими переменными
#include <iostream>
using namespace std;
template<int n> struct Fibo { static int x; };
template<> int Fibo<0>::x = 1;
template<> int Fibo<1>::x = 1;
template<int n> int Fibo<n>::x = Fibo<n-1>::x + Fibo<n-2>::x; //marked line
int main() {
cout << Fibo<5>::x << endl;
cout << Fibo<4>::x << endl;
cout << Fibo<3>::x << endl;
cout << Fibo<2>::x << endl;
cout << Fibo<1>::x << endl;
cout << Fibo<0>::x << endl;
return 0;
}
выходов
0
0
1
2
1
1
в VC++. (Согласно пользователю M M. он компилируется, как ожидалось, в gcc). Когда компилятор получает отмеченной линии с n=5
он не компилируется ту же самую линию снова n=4
, но только лечит Fibo<4>::x
, как если бы он был объявлен с
template<> int Fibo<4>::x; // x defaults to 0
Почему это? Почему он работает должным образом при использовании
template<int n> struct Fibo { enum { x = Fibo<n-1>::x + Fibo<n-2>::x }; };
template<> struct Fibo<0> { enum { x = 1 }; };
template<> struct Fibo<1> { enum { x = 1 }; };
вместо этого, но не со статической переменной? И как вы исправите первый код (без enum
)?
Он компилируется в 'gcc-4.8.0' и вывод '' 8 5 3 2 1 1 "'. – deepmax
Ничего, я никогда не знал, что вы можете специализировать инициализаторы статических элементов. –
Спасибо, M M. Я добавлю, что я использовал VC++. –