2011-12-21 45 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 2011-12-21 08:49:43

+1

我是否遗漏了一些php或wtf的类? – 2011-12-21 08:58:45

+0

您可以发布您收到的整个错误消息吗? – 2011-12-21 10:23:35

回答

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 +'。 – 2011-12-21 10:28:37

+0

@ TomalakGeret'kal:它不是一个函数模板,因此不需要推论任何参数。 – 2011-12-21 10:30:20

+0

好的,是的;但是'op *'中的'T'也不是推导出来的。 – 2011-12-21 10:31:06

相关问题