Как включить включение не-членной operator- перегрузки для класса шаблона в c++?

58
6

Я новичок в c++, и шаблоны определенно не дружелюбны в синтаксисе. В основном, вот некоторые из функций, которые я написал, протестировал и закончил. Только один быстрый вопрос, я пытался часами писать перегрузку non-member operator- для моего матричного класса и получал все типы синтаксических ошибок. Итак, с чего начать?

Вот мой myMatrix.h:

#ifndef MYMATRIX_H
#define MYMATRIX_H

#include <exception>
#include <vector>
#include <iostream>

using namespace std;

/* I'm using this matrix to store data */
template<typename T>
using twoD = std::vector<std::vector<T>>;

template<class T>
class Matrix{
private:
int rows;
int cols;
twoD<T> matrix;
protected:
void validSizeCheck(int rows, int cols);
public:
Matrix(int rows, int cols);
Matrix(int rows, int cols, twoD<T> newMatrix);
twoD<T> getMatrix();
int getRows();
int getCols();
void printMatrix();
void operator=(const Matrix<T> &);
Matrix<T> &operator+=(const Matrix<T> &);
Matrix<T> operator+(const Matrix<T> &);
Matrix<T> operator*(const Matrix<T> &);
Matrix<T> operator*(const T &);
};

Вот одна из вещей, которую я пробовал:

template <class T>
Matrix<T> operator-(const Matrix<T>& lhs,const Matrix<T>& rhs){
if(lhs.rows != rhs.cols || lhs.rows != rhs.cols{
throw exception();
}
Matrix tmp(lhs.rows, lhs.cols);
for(int i = 0; i < lhs.rows; i++){
for(int j = 0; j < cols; j++){
tmp.matrix[i][j] = lhs.matrix[i][j]+rhs.matrix[i][j];
}
}
return tmp;
}

Очевидно, что это не сработало. Итак, каков синтаксис, которым я должен следовать за этим? Кроме того, это может быть очень глупый вопрос, но должна ли функция, не являющаяся членом, в файле заголовка или в файле.cpp? До сих пор все, что я написал, было в файле.h, поскольку они все шаблоны.

Любая помощь будет принята с благодарностью.

ОБНОВЛЕНО: наконец, я получил код для работы, для объявления класса и функции я добавил следующее:

template<class T>
class Matrix{
private:
...
protected:
...
public:
...
template<class U>
friend Matrix<U> operator-(const Matrix<U>& lhs, const Matrix<U>& rhs);
};

Вот определение функции:

 template <class U>
Matrix<U> operator-(const Matrix<U>& lhs,const Matrix<U>& rhs){
if(lhs.rows != rhs.cols || lhs.rows != rhs.cols){
throw exception();
}
Matrix<U> tmp(lhs.rows, lhs.cols);
for(int i = 0; i < lhs.rows; i++){
for(int j = 0; j < lhs.cols; j++){
tmp.matrix[i][j] = lhs.matrix[i][j]-rhs.matrix[i][j];
}
}
return tmp;
}

работает отлично, без предупреждения! Спасибо всем за помощь

спросил(а) 2018-04-29T05:20:00+03:00 2 года, 6 месяцев назад
1
Решение
91

rows членов, cols являются частными. Неклассовый оператор-член должен быть другом класса. Объявите его в классе:

friend Matrix<T> operator-<>(const Matrix<T>& lhs,const Matrix<T>& rhs);

Прочтите эту статью для получения дополнительной информации: Перегрузка оператора: функция-член или функция, не являющаяся членом?

Кроме того, это может быть очень глупым вопросом, но должна ли функция, не являющаяся членом, в файле заголовка или в файле.cpp? До сих пор все, что я написал, было в файле.h, поскольку они все шаблоны.

Вы сделали это правильно, все шаблоны должны быть в файле заголовка. Вот еще информация: Почему шаблоны могут быть реализованы только в файле заголовка?

ответил(а) 2018-04-29T05:30:00+03:00 2 года, 6 месяцев назад
92

Вам нужно снова использовать параметры шаблона в объявлении переменной temp внутри:

template <class T>
Matrix<T> operator-(const Matrix<T>& lhs,const Matrix<T>& rhs){
if(lhs.rows != rhs.cols || lhs.rows != rhs.cols{
throw exception();
}
Matrix<T> tmp(lhs.rows, lhs.cols);
for(int i = 0; i < lhs.rows; i++){
for(int j = 0; j < cols; j++){
tmp.matrix[i][j] = lhs.matrix[i][j]+rhs.matrix[i][j];
}
}
return tmp;
}

(изменение находится в строке 5: Matrix<T> tmp(lhs.rows, lhs.cols);)

ответил(а) 2018-04-29T05:31:00+03:00 2 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема