2011-11-07 7 views
2

私は他の多くの人と同様に、私の個人的使用のための線形代数ライブラリを作成しています。そうすることで、私はC++でテンプレートを使ったプログラミングについてもっと学びたいと思っています。私は今、私は正方行列(例えば決定)に制限したい特定の操作がある 等価パラメータのC++関数の特殊化

template<typename T, size_t N, size_t M = N> 
class Matrix 
{ 
    ... 
} 

のようなものだクラスを持っています。しかし、私が追加しようとするとき:

T Determinant<T,N,N>(); 

エラーが "Missing ';' 「<」の前に。私は行列式の呼び出しの上に別のテンプレートを追加しようとしましたが、成功することはありません。これを達成するためのアドバイスは非常に高く評価されます。

+0

「N」は、テンプレートパラメータ名ではなく、定義するポイントになります。 –

答えて

4

残念ながら、そのような特定のテンプレートパラメータに対して関数を特殊化することはできません。クラス全体を行う必要があります。全体を再コーディングしたくないので、おそらく継承を使用したいと思うでしょう。

//shared code 
template<typename T, size_t N, size_t M> 
class BaseMatrix 
{ 
    //existing code 
}; 

// non-square general case 
template<typename T, size_t N, size_t M=N> 
class Matrix : public BaseMatrix<T,N,M> 
{ 
    //forwarding headers 
    Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {} 
}; 

//square matrix specialization 
template<typename T, size_t N> 
class Matrix : public BaseMatrix<T,N,N> 
{ 
    //forwarding headers 
    Matrix (const Matrix<T,N,M>& b) : BaseMatrix<T,N,M>(b) {} 
    T Determinant(); 
}; 
+0

ありがとう!これはうまくいくように見えます。 – Octavianus

-3

Matrix<float, 10, 10> myMatrix;のような変数を宣言する必要があります。

3

ここで、正方行列(行列式など)に限定したい操作があります。

あなたはこのようなフリー機能を意味します:

template< typename T, std::size_t N > 
T determinant(Matrix< T, N, N > const& m){ ... } 

か、クラスメンバーとしてそれを意味するのですか?クラスメンバーが必要な場合は、すべての一般的な機能を基本クラスに移動し、Matrixのテンプレート特殊化を使用して、正方行列の特別な機能を組み込む方がよいでしょう。

0

私は基本クラスの考え方をサポートしています。 MatrixクラスとSquareMatrixサブクラスがあります。 SquareMatrixクラスのDeterminantメソッドを宣言し、テンプレートを処理することなく行列が正方形であると安全に仮定します。行列式の方が簡単になり、それを呼び出すコードも同様になります。

関連する問題