2017-05-16 8 views
0

テンプレートメタプログラミングを使用して正弦関数を実装しようとしています。しかし、私はエラー 'radtest'はdouble &の有効なテンプレート引数ではないため、cv-qualificationの競合が発生します。コードは次のとおりです。テンプレートのメタプログラミング、cv-qualificationエラーの競合

#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

問題はradtestconstであるということである(constexprによって暗示)ので、あなたはそれにsineバインドのdouble&パラメータを持つことはできません。

double radtest(constexprではない)にするか、すべてのテンプレートパラメータをconst double&にしようとすると、別の問題が発生します。一時的に参照非型テンプレートパラメータにバインドすることはできません。これは、明示的に標準で禁止されています

§14.3.2テンプレート非型引数が

テンプレート引数を非タイプテンプレートパラメータには 変換定数式でなければなりません(5.20)のテンプレートパラメータのタイプの です。

  • :参照 またはポインタ型の非タイプテンプレートパラメータため、定数式の値が (またはポインタ型のためのアドレスであってはならない)とを参照してはなりません。 ..私は個人的にこの混乱から抜け出す道が表示されない

  • (1.2)一時オブジェクト(12.2)、
  • ...。これは(非型パラメータのテンプレートとしての参照を使用して)実際にC++テンプレートシステムのできる範囲を広げています。

    私がお勧めできるのは、constexpr sin関数を作成することです。

  • +0

    はい、これはまさに私がすべてのパラメータをconst double&にしようとしていたときの問題です。私は構造体をパラメータとして使用しようとしましたが、他のコンパイルの問題が発生しました。 – Hermetix

    関連する問題