代码
#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”。 - masoud0 0 1 2 1 1
。 - TemplateRex