Перегруженные операторы не распознаются. Ошибка 2 - PullRequest
0 голосов
/ 17 мая 2018

Я написал матричный класс с перегруженными операторами.Однако всякий раз, когда я использую свой класс Matrix в другом файле, мой код не компилируется.Вот мои файлы

Файл Matrix.h

#include <vector>
#include <iostream>

#ifndef _MATRIX_H
#define _MATRIX_H

class Matrix {
private:
  int row, col;
public:
  std::vector<std::vector<double>> matrix;
  Matrix(int);
  ~Matrix();
  int getRows() const { return row; }
  int getCols() const { return col; }
  std::vector<double>& operator[](int index){
    return matrix.at(index);
  }

  Matrix& operator+=(const Matrix& b){
    if(row != b.getRows() || col != b.getCols()){
      std::cerr << "Mismatched dimensions for +" << std::endl;
      std::cerr << "A is " << row << "x" << col << std::endl;
      std::cerr << "B is " << b.getRows() << "x" << b.getCols() << std::endl;
      throw std::exception();
    }
    for(int i = 0; i < this->row; i++){
      for(int j = 0; j < this->col; j++){
        this->matrix[i][j] += b.matrix[i][j];
      }
    }
    return *this;
  }


};

#endif

Файл Matrix.cpp

#include "Matrix.h"

/**
* This constructor takes in a single positive integer n and
* makes an nxn sized matrix.
*/
Matrix::Matrix(int size){
  if(size <= 0){
    std::cerr << "Invalid size: " << size << std::endl;
    std::cerr << "Sizes must be greater than 0!" << std::endl;
    throw std::exception();
  }
  row = size;
  col = size;
  matrix.resize(size);
  for(int i = 0; i < size; i++){
    std::vector<double> newVector(size);
    matrix[i] = newVector;
    for(int j = 0; j < size; j++){
      matrix[i].push_back(0);
    }
  }
}


Matrix::~Matrix() {
}

Matrix& operator+(Matrix a, const Matrix& b){
  return a += b;
}

TestMatrix.cpp

#include "Matrix.h"


int main(){
  Matrix a(2);
  Matrix b(2);
  a + b;
  return 0;
}

Я скомпилировалиспользуя следующую команду

g ++ TestMatrix.cpp Matrix.cpp

, и я получил это только как вывод

TestMatrix.cpp: Inфункция 'int main ()': TestMatrix.cpp: 8: 9: ошибка: нет совпадения с оператором + (типы операндов - «Матрица» и «Матрица») a + b;^

Мой вопрос: как перегрузить операторы так, чтобы компилятор их распознал?

1 Ответ

0 голосов
/ 17 мая 2018

Ваш файл TestMatrix.cpp не может видеть, что вы определили operator+ в другом исходном файле.

Добавьте это в Matrix.h:

Matrix operator+(Matrix a, const Matrix& b);

Это объявление функции . объявляет , что эта функция существует.

...