2017-05-16 3 views
0

템플릿 메타 프로그래밍을 사용하여 사인 함수를 구현하려고합니다. 그러나 'radtest'가 double &에 대한 유효한 템플릿 인자가 아니므로 cv-qualification의 충돌 때문에 오류가 발생합니다. 다음은 코드입니다.템플릿 메타 프로그래밍, CV 적격 오류의 충돌

#include <iostream> 
using namespace std; 

template <double&, int, int> struct 
Series; 

template <double& rad> struct Sine 
{ 
    enum 
    { 
     maxterms=10 
    };  

    static inline double sin() 
    { 
     return (rad) * 
    Series<(rad), 0, maxterms>::val(); 
    } 
}; 

template <double& rad, int i, int 
maxterms> struct Series 
{ 
    enum 
    { 
     cont = i+1 != maxterms, 
     nxt1 = (i+1)*cont, 
     nxtmax = maxterms*cont  
    }; 

    // uses recursive definition of 
    // Sine 
    // sin(x)=x*term(0) 
    // term(n)=1- 
    // x*x/(2*n+2)/(2*n+3)*term(n+1) 
    static inline double val() 
    { 
     return 1 - (rad)* 
(rad)/(2.0*i+2.0)/(2.0*i+3.0) 
     * Series<rad * cont, nxt1, 
nxtmax>::val(); 

    } 
}; 

#define SineT(rad) Sine<rad>::sin() 
constexpr double radtest=0.707; 

int main() 
{ 
    cout << "Sine of " << radtest 
<< " is: " << SineT(radtest); 
    return 0; 
} 

무엇이 문제입니까? 미리 감사드립니다.

+0

'double '템플릿 인수로 –

+0

'rad :: val()'의'rad * cont'가 아니라고 생각합니다. 'constexpr double &' –

답변

0

문제는 radtest이 (constexpr 암시) const 그래서 당신이 그것에 double& 매개 변수 바인딩 sine의이 없을 수 있다는 것입니다.

double radtest (constexpr 아님)을 만들거나 모든 템플릿 매개 변수를 만들려고하면 const double& 다른 문제가 발생합니다. 임시 템플릿을 참조 템플릿이 아닌 매개 변수에 바인딩 할 수 없습니다. 템플릿 매개 변수이 변환 상수 표현한다

§ 14.3.2 템플릿 이외의 형태 인수를

템플릿 인수이 아닌 유형이 명시 적으로 표준에 의해 허용되지 않습니다 (5.20) 템플릿 매개 변수의 형식입니다.

  • : 비 형 참조 또는 포인터 타입의 템플릿 파라미터 내용에 참조 없다 상수 식의 값 (또는 포인터 유형의 주소이어야한다). .. 나는 개인적으로이 혼란에서 방법을 볼 수 없습니다

  • (1.2) 임시 객체 (12.2),
  • .... (템플릿이 아닌 매개 변수로 참조를 사용하여) C++ 템플릿 시스템이 수행 할 수있는 작업의 범위를 실제로 넓히고 있습니다.

    제가 권장 할 수있는 것은 단지 constexpr 죄 기능을 만드는 것입니다.

  • +0

    네, 이것은 모든 파라미터를 const double로 만들려고 할 때 제가 가진 문제입니다. 구조체를 매개 변수로 사용했지만 다른 컴파일 문제가 발생했습니다. – Hermetix