2011-12-21 21 views
2
template <size_t M, size_t N, typename T> 
class Matrix 
{ 
public: 
    Matrix<M, N, T> operator +(const Matrix<M, N, T>& B) const; 
    template <size_t P> Matrix<M,P,T> operator*(const Matrix<N, P, T>& B) const; 
    template <typename T2> operator T2() const; 

private: 
    T __x[M][N]; 
}; 

ボディはうまく書いてあり、すべてうまくいきます。私は以下のように二つの行列を定義する場合:私は以下のようなマトリックスクラスを持っています:

Matrix < 10, 10, int> m1; 
Matrix < 10, 10, float> m2; 

m1 + m2; // OK 
m1 * m2; // error: no match for 'operator*' in 'm1 * m2' 

を暗黙的キャストがそこに行っているため、さらには、うまく動作しますが、異なる値型の乗算のために、エラーが発生します。

error: no match for 'operator*' in 'm1 * m2' 

+0

これはPHPまたはMySQLの質問の仕組みですか? – GordonM

+1

私はいくつかのクラスのPHPやwtfを残しましたか? –

+0

エラーメッセージ全体を投稿できますか? –

答えて

2

This questionも同様の問題があります。エラーの理由は、暗黙的な変換はテンプレート引数を推測する際に考慮されないためです。乗算演算子は関数テンプレートなので、明示的にパラメータを指定せずに呼び出すと、コンパイラは引数の型を推定しようとします。あなたが明示的にパラメータPを提供する場合を証明するには、それがコンパイルされます。

m1.operator*<10>(m2); 

を問題を修正するには、あまりにも右辺の値型テンプレート引数を作ることができる:

template <size_t P, typenmame T2> 
Matrix<M,P,T> operator*(const Matrix<N, P, T2>& B) const; 
+0

私は 'op +'の方が少しうんざりです。 –

+0

@ TomalakGeret'kal:これは関数テンプレートではないので、引き数を引き出す必要はありません。 –

+0

OK、true;しかし 'op * 'の' T'も推論されません。 –

関連する問題