2016-12-25 2 views
0

저는 C++ 템플릿의 초보자입니다. 템플릿을 사용하여 계승을 계산하고 아래 코드를 첨부하려고합니다. if (t == 0) 섹션을 템플릿 전문화를 사용하여 바꾸고 싶지만 지금까지는 그렇게 할 수 없습니다. 당신의 전문은 잘못,
사용법 #include고정 값 템플릿 지정

template <class T> 
    class Factorial 
    { 
     public: 
      T factorial(T t) 
      { 
       if(t==0) 
        return 1; 
       fact[t] = t*factorial(t-1); 
       std::cout<<"t and fact[t] "<<t<<", "<<fact[t]<<std::endl; 
       return fact[t]; 
      } 

      void Print(T t) 
      { 
       std::cout<<"fact["<<t<<"] = "<<fact[t]<<std::endl; 
      } 

     private: 
      T fact[100]; 
    }; 

    /* 
    std::constexpr bool isZero(int x) 
    { 
     if(x==0) 
      return true; 
    } 
    */ 

    template<> 
    class Factorial<0> 
    { 
     public: 
      int factorial(int x) 
      { 
       return 1; 

     } 

      void Print(int t) 
      { 
       std::cout<<"special fact["<<t<<"] = "<<1<<std::endl; 
      } 
    }; 
    int main() 
    { 
     Factorial<int> fact; 
     fact.factorial(5); 
     fact.Print(4); 

     return 0; 
    } 
+0

재귀 템플릿을 사용하여 작성된 계승 함수의 예는 수천 가지가 있습니다. 먼저 작업 예제를 얻고 이처럼 솔로를 비행하기 전에 어떻게 완료되었는지 확인하는 것이 좋습니다. – PaulMcKenzie

답변

4

에게 첫째을 도와주세요 : 당신이 값 유형을 기대 매개 변수에 템플릿을 전문으로 할 수 없다. 유형별로 Factorial 클래스 템플릿을 전문화 할 수 있습니다. 당신은 당신이 가치의 측면에서 기본 템플릿 여행을 내리는 데 필요한 것 값에 템플릿을 전문으로하고 싶었 예를 들어,

template <> 
class Factorial<int> { 
    ... 
}; 

전문 수 예 :

template <int N> 
class Factorial { // primary template 
    ... 
}; 
template <> 
class Factorial<0> { // specialization 
    ... 
}; 

다음 , 계산은 사실상 런타임 계산이므로 실행 시간 값을 템플릿 전문화 처리기로 디스패치 할 수는 없습니다. 당신이 실제로 그런 식으로 뭔가를하고 싶다면 그것을 프로그래밍 방식으로 할 필요가 있습니다. 즉, 함수 안에 있으면 컴파일러가 템플릿 전문화에 함수 인수를 전달할 수 없게됩니다. 컴파일러에서 템플릿 전문화를 수행하려면 상수 표현식을 사용해야합니다 (아마도 클래스 템플릿의 [static] 형태로).