2016-04-01 3 views
0

Я пытаюсь умножить матрицу-матрицу с шаблоном, и я продолжаю получать следующую ошибку. (Я пытаюсь умножать без квадратной матрицы)Матрица Матрица Матрица умножения C++

Ошибка 1 Ошибка C2593: «оператор *» неоднозначен

Может ли один дать мне советы о том, как это исправить?

//Matrix.h 
#pragma once 
#include <iostream> 
#include <vector> 
using namespace std; 

template<class T, int m, int n> 
class Matrix; 

template<class T, int m, int n, int l> 
Matrix<T, m, n> operator*(const Matrix<T, m, n>&, const Matrix<T, n, l>&); 

template<class T, int m, int n> 
class Matrix 
{ 
vector<vector<T>> elements; 
int nrow; 
int ncol; 

public: 
    Matrix(); 
    ~Matrix(); 
    void print(); 
    template<int l> 
    friend Matrix<T, m, l> operator*<>(const Matrix<T, m, n>&, const Matrix<T, n, l>&); 

}; 

template<class T, int m, int n> 
Matrix<T, m, n>::Matrix() : nrow(m), ncol(n) 
{ 
    for (int i = 0; i < nrow; i++){ 
     vector<T> row(ncol, i); 
     elements.push_back(row); 
    } 
} 

template<class T, int m, int n> 
Matrix<T, m, n>::~Matrix(){} 

template<class T, int m, int n> 
void Matrix<T, m, n>::print() 
{ 
    for (int i = 0; i < nrow; i++){ 
     for (int j = 0; j < ncol; j++){ 
      cout << elements[i][j] << " "; 
     } 
    cout << endl; 
    } 
} 

template<class T, int m, int n, int l> 
Matrix<T, m, l> operator*(const Matrix<T, m, n>& m1, const Matrix<T, n, l>& m2){ 
    int nrow = m1.nrow; 
    int ncol = m2.ncol; 
    Matrix<T, m, l> m3; 
    for (int i = 0; i < nrow; ++i){ 
     for (int j = 0; j < ncol; ++j){ 
      m3.elements[i][j] = 0; 
      for (int k = 0; k < m1.ncol; k++){ 
       T temp = m1.elements[i][k] * m2.elements[k][j]; 
       m3.elements[i][j] = temp + m3.elements[i][j]; 
      } 
     } 
    } 
return m3; 
} 

//main.cpp 
#include "Matrix.h" 
using namespace std; 

int main() 
{ 
Matrix<int, 3, 2> a; 
Matrix<int, 2, 1> b; 
Matrix<int, 3, 1> c; 
c = a*b; 

c.print(); 
} 

Проблема возникает в матричном умножении, возможно, из-за ошибки кодирования в шаблоне.

+0

Вектор вектор плохой: ваш массив не должен быть «зубчатым» таким образом. – Yakk

ответ

1

мне пришлось изменить то, что Ричард изменился, но я также должен был изменить декларацию operator* и friend, как следует:

template<class T, int m, int n, int l> 
Matrix<T, m, l> operator*(const Matrix<T, m, n>&, const Matrix<T, n, l>&); 
      //^here 

и:

template<class _T, int _m, int _n, int l> 
friend Matrix<_T, _m, l> operator*(const Matrix<_T, _m, _n>&, const Matrix<_T, _n, l>&); 

Я получил «operator* неоднозначна» ошибку, если я не изменил первый из этих двух, так как опережающее объявление не соответствует экземпляру дальше вниз.

Это в настоящее время вывода:

0 
1 
2 

Это не кажется совершенно правы, но я не достаточно просыпаются отлаживать дальше.

+0

Это правильно! Я инициализировал матрицу с каждой записью, равной ее номеру строки. Например, матрица 3x2, у меня есть [0,0; 1,1; 2,2] и 2x1 матрица [0; 1], поэтому, умножая их, я получил [0; 1; 2]. Большое вам спасибо ^^ У меня есть быстрый вопрос. Зачем нужен другой класс _T и integer _m и _n? Я уже создаю их (класс T, int m, int), когда объявляю матрицу. Еще раз спасибо, и я надеюсь получить комментарии по моему вопросу. ^^ – SungwonAhn

+0

Короткий ответ заключается в том, что компилятор жаловался, если я попытался использовать классы 'T',' m' и 'n'; Я взял легкий путь и дал ему разные имена, и это просто сработало. Вероятно, это связано с объявлением 'operator *' вне класса и использованием 'friend' вместо того, чтобы просто делать оператор' operator * '. Я смог заставить работать в классе 'operator *' работать правильно, но это выглядит немного странно. – user2475059

1

Ошибка здесь:

./matrix.cpp:48:28: error: function template partial specialization is not allowed 
    friend Matrix<T, m, l> operator*<>(const Matrix<T, m, n>&, const Matrix<T, n, l>&); 
         ^  ~~ 
1 error generated. 

изменить его к этому:

friend Matrix<T, m, l> operator*(const Matrix<T, m, n>&, const Matrix<T, n, l>&);