2017-05-10 5 views
-5

was ich erreichen möchte, ist es, eine Vorlage Matrix-Klasse zu halten, aber es gibt einige Fehler (etwa 30 Fehler, die viel ist), die ich nicht wirklich verstehe. bitte helfen !! einige der Fehler: 'Bezeichner': undeclared Bezeichner, zeigt es für Spalte, Zeile und T. nicht erkennbare Vorlage Deklaration/Definition. 'Operator < <': sieht wie eine Funktionsdefinition aus, aber es gibt keine Parameterliste. Syntaxfehler: ‚‘C++ Vorlagenklasse. Ich habe einen Fehler, den ich nicht verstehe. etwa 30 von ihnen

template <int row, int col, typename T> 
ostream& operator<<(ostream& out, const Matrix<row, col,T>& other) 

{ 

    return other.print(out); 
} 

template <int row, int col, typename T> 

Matrix<row, col, T>& operator+(T number, const Matrix<row, col, T>& other) 
{ 

    Matrix<other.getRow(), other.getCol(), T> numMat(number); 

    return (numMat + other); 
} 

template <int row, int col, typename T = int> 

class Matrix { 

public: 

    Matrix(T number); 

    Matrix(); 

    Matrix(const Matrix<row, col, T>& other); 

    int getRow(); 

    int getCol(); 

    Matrix& operator+(const Matrix<row, col, T>& other); 

    Matrix& operator-(const Matrix<row, col, T>& other); 

    Matrix& operator+(T number); 

    Matrix& operator-(T number); 

    Matrix& operator++(); 

    Matrix& operator--(); 

    Matrix& operator++(int); 

    Matrix& operator--(int); 

    Matrix& operator*(T number); 

    T& operator()(int a, int b); 

    ostream& print(ostream& out) const; 

    T trace(); 

    ~Matrix(); 

private: 

    int _row, _col; 

    T** matrix; 

}; 




template <int row, int col, typename T> 

Matrix<row, col, T>:: Matrix(T number) { 

    _row = row; 

    _col = col; 

    matrix = new T*[_row]; 

    for (int i = 0; i < row; i++) { 

     matrix[i] = T[_col]; 

    } 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _col; j++) { 

      matrix[i][j] = number; 


     } 

    } 

} 


template <int row, int col, typename T = int > 

Matrix<row, col, T>::Matrix() { 

    _row = row; 

    _col = col; 

    matrix = new T*[_row]; 

    for (int i = 0; i < _row; i++) { 

     matrix[i] = T[_col]; 

    } 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _col; j++) { 

      matrix[i][j] = 1; 

     } 

    } 

} 


template <int row, int col, typename T> 

Matrix<row, col, T>::Matrix(const Matrix<row, col, T>& other) { 

    _row = other._row; 

    _col = other._col; 

    matrix = new T*[_row]; 

    for (int i = 0; i < _row; i++) { 

     matrix[i] = new T[_col]; 

    } 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _col; j++) { 

      matrix[i][j] = other.matrix[i][j]; 

     } 

    } 

} 



template <int row, int col, typename T> 

int Matrix<row, col, T>::getRow() { 

    return _row; 

} 

template <int row, int col, typename T> 

int Matrix<row, col, T>::getCol() { 

    return _col; 

} 

template <int row, int col, typename T> 

Matrix<row, col, T>& Matrix<row, col, T>::operator+(const Matrix<row, col, T>& 
other) { 

    Matrix<getRow(), getCol(), T> mat1; 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _row; j++) { 

      mat1.matrix[i][j] = matrix[i][j] + other.matrix[i][j]; 

     } 

    } 

    return mat1; 

} 


template <int row, int col, typename T> 

Matrix<row, col, T><row, col, T>::operator-(const Matrix<row, col, T>& other) { 

    Matrix<getRow(), getCol(), T> mat1; 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _row; j++) { 

      mat1.matrix[i][j] = matrix[i][j] - other.matrix[i][j]; 

     } 

    } 

    return mat1; 

} 


template <int row, int col, typename T> 

Matrix<row, col, T>& Matrix<row, col, T>::operator+(T number) { 

    Matrix<getRow(), getCol(), T> mat1; 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _col; j++) { 

      mat1.matrix[i][j] = matrix[i][j] + number; 

     } 

    } 

    return mat1; 
} 


template <int row, int col, typename T> 

Matrix<row, col, T>& Matrix<row, col, T>::operator-(T number) { 

    Matrix<getRow(), getCol(), T> mat1; 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _col; j++) { 

      mat1.matrix[i][j] = matrix[i][j] - number; 

     } 

    } 

    return mat1; 

} 


template <int row, int col, typename T> 

Matrix<row, col, T>& Matrix<row, col, T>::operator++() { 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _col; j++) { 

      ++matrix[i][j]; 

     } 

    } 

    return *this; 

} 


template <int row, int col, typename T> 

Matrix<row, col, T>& Matrix<row, col, T>::operator--() { 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _col; j++) { 

      --matrix[i][j]; 

     } 

    } 

    return *this; 

} 


template <int row, int col, typename T> 

Matrix<row, col, T>& Matrix<row, col, T>::operator++(int) { 

    Matrix<row, col, T> tmp(Matrix); 

    ++(*this); 

    return tmp; 

} 


template <int row, int col, typename T> 

Matrix<row, col, T>& Matrix<row, col, T>::operator--(int) { 

    Matrix<row, col, T> tmp(Matrix); 

    --(*this); 

    return tmp; 

} 


template <int row, int col, typename T> 

Matrix<row, col, T>& Matrix<row, col, T>::operator*(T number) { 

    Matrix<getRow(), getCol(), T> mat; 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _col; j++) { 

      mat.matrix[i][j] = matrix[i][j] * number; 

     } 

    } 

    return mat; 

} 


template <int row, int col, typename T> 

T& Matrix<row, col, T>::operator()(int a, int b) { 

    if (a < _row && b < _col) { 

     return matrix[a][b]; 

} 

    return NULL; 

} 


template <int row, int col, typename T> 

const ostream& Matrix<row, col, T>::print(ostream& out) const { 

    for (int i = 0; i < _row; i++) { 

     out << matrix[i] << std::endl; 

    } 

    return out; 

} 


template <int row, int col, typename T> 

T Matrix<row, col, T>::trace() { 

    T tr; 

    for (int i = 0; i < _row; i++) { 

     for (int j = 0; j < _col; j++) { 

      tr += matrix[i][j]; 

     } 

    } 

    return tr; 

} 


template <int row, int col, typename T> 

Matrix<row, col, T>::~Matrix() { 

    for (int i = 0; i < _row; i++) { 

     delete[]matrix[i]; 

    } 

    delete[]matrix; 
} 
+1

Sollen wir die Fehler erraten? – EdChum

+0

die Fehler nicht angezeigt werden, wenn die Kopfzeile allein ist, agieren sie, wenn die Quelldatei hinzugefügt wird, die ich nicht ändern kann, von denen ich denke, dass das Hauptproblem sein kann –

+0

nicht erkennbare Vorlage Deklaration/Definition –

Antwort

2

Zuerst den vollständigen Text aller Fehler posten.

Zweitens haben Sie zwei Funktionen Matrix verwenden, bevor sie deklariert ist, entweder

template <int row, int col, typename T = int> 
class Matrix; 

am Anfang der Datei setzen oder ostream& operator<< und Matrix<row, col, T>& operator+ bis nach der Definition von Matrix bewegen.

Drittens brauchen Sie nicht _row und _col Datenelemente, verwenden Sie einfach die Vorlage Parameter. Wenn andere Orte sie benötigen, können Sie dieses in Matrix

constexpr int Rows = row; 
constexpr int Cols = col; 

und verwenden Sie es wie

for (int i = 0; i < my_matrix.Rows; ++i) 

Viertens anstatt C-Arrays verwenden, sollten Sie stattdessen mit std::array, da es viele nützliche Methoden definiert, in erster Linie können Sie die Standardkopie & Move Konstruktoren und Destruktoren verwenden.

Verwandte Themen