Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        2年前关闭。
                                                                                            
                
        
有人问过我关于静态对象的用法,我想我了解使用它们背后的症结,但是有一个特殊的情况使我感到困惑,我知道在代码中他们正在尝试使用递归调用来构建类似析因的机制,但确实无法理解代码将经历的不同阶段。

#include<iostream>

using namespace std;

template<short N> class C
{
  private:
     static C<N-1>c;
  public:
     static int const n = N*c.n;
};

template<> class C<0>
{
    public:
    static int const n =1;
};

int main()
{
    cout<<C<5>::n<<endl;
    return 0;
}


请观看实时演示here

这段代码正在生成输出120

这里到底发生了什么?

最佳答案

不幸的是,这条线

static C<N-1>c;


存在。它使逻辑有些混乱。

该功能可以很容易地实现为:

template<short N> class C
{
   public:
     static int const n = N*C<N-1>::n;
};

template<> class C<0>
{
  public:
    static int const n = 1;
};


这一点比较容易理解。

最终效果是相同的:

C<5>::n = 5*C<4>::n
C<4>::n = 4*C<3>::n
C<3>::n = 3*C<2>::n
C<2>::n = 2*C<1>::n
C<1>::n = 1*C<0>::n
C<0>::n = 1


现在,您可以了解程序如何产生输出。

10-01 13:00