2011-12-21 3 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; но тогда 'T' в' op * 'также не выводится. –

Смежные вопросы