У меня есть класс матрицы, как показано ниже: - PullRequest
2 голосов
/ 21 декабря 2011
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 Ответ

2 голосов
/ 21 декабря 2011

Этот вопрос имеет похожую проблему. Причина вашей ошибки в том, что неявные преобразования не учитываются при выводе аргументов шаблона. Так как ваш оператор умножения является функцией-шаблоном, и вы вызываете без явного предоставления параметра, компилятор пытается определить тип аргумента и завершается неудачно. Для демонстрации, если вы явно предоставите параметр P, он скомпилирует:

m1.operator*<10>(m2);

Чтобы решить эту проблему, вы можете сделать тип-значения правой стороны также аргументом шаблона:

template <size_t P, typenmame T2> 
Matrix<M,P,T> operator*(const Matrix<N, P, T2>& B) const;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...