编码
#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
)?