我有一个矩阵类,如下所示:

时间:2011-12-21 08:42:27

标签: c++ templates

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'

有什么想法吗?!

1 个答案:

答案 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;