Как включить не перегруженную оператором перегрузку для класса шаблона в c ++? - PullRequest
0 голосов
/ 29 апреля 2018

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

Вот мой 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;    
}

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

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вам необходимо снова использовать параметры шаблона при объявлении переменной 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);)

0 голосов
/ 29 апреля 2018

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

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

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

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

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

...