2016-04-01 13 views
2

Wenn ich versuche, die folgende Codierung zu kompilieren, ich habe einen Fehler sagenTemplate Matrix Skalarmultiplikation C++

Fehler 1 Fehler LNK2019: nicht aufgelöstes externes Symbol „Klasse Matrix __cdecl operator * (int const &, Klasse Matrix &) "(?? D @ YA? AV? $ Matrix @ H $ 02 $ 01 @@ ABHAAV0 @@ Z) referenziert in Funktion _main C: \ Benutzer \ PC \ Dokumente \ Visual Studio 2013 \ Projekte \ Homework4 \ Homework4 \ main.obj Homework4

Dieser Fehler ist von der Skalarmultiplikation auf Matrix aufgetreten und ich weiß nicht, wie man es repariert. Kann mir jemand dazu einen Rat geben?

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

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

public: 
Matrix(); 
~Matrix(); 
void print(); 
vector<T> row(int); 
vector<T> col(int); 

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

}; 

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> 
vector<T> Matrix<T, m, n>::row(int i) 
{ 
return elements[i]; 
} 

template<class T, int m, int n> 
vector<T> Matrix<T, m, n>::col(int j) 
{ 
vector<T> col; 
for (int i = 0; i < ncol; i++) 
{ 
    col.push_back(elements[i][j]); 
} 
return col; 
} 

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> 
Matrix<T, m, n> operator+(const Matrix<T, m, n>& m1, const Matrix<T, m, n>& m2){ 
Matrix<T, m, n> m3; 
int nrow = m1.nrow; 
int ncol = m1.ncol; 
for (int i = 0; i < nrow; ++i){ 
    for (int j = 0; j < ncol; ++j){ 
     m3.elements[i][j] = m1.elements[i][j] + m2.elements[i][j]; 
    } 
} 

return m3; 
} 

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

return m3; 
} 


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

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

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

c.print(); 
} 

Ich denke, der Fehler von der Friend-Funktion kommt (Betrieb *) im Körper der Klasse, aber ich weiß nicht, wie es zu beheben ...

Antwort

1

Der Fehler, weil tritt eine) operator* wird als Nichtvorlage deklariert (Sie sollten <> verwenden) b) Wenn Sie die Syntax <> verwenden, müssen Sie die Deklaration der Vorlage angeben.

Fix (hinzufügen, bevor Matrix-Klasse):

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

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

//class matrix definition here 

hinzufügen <>-operator*friend Erklärung:

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

Vielen Dank für die Antwort. Leider habe ich getan, was du mir gesagt hast und es gibt mir immer noch einen Fehler. Ich entfernte die "const" von "Const T &" auch hinzugefügt <>. Außerdem habe ich die oberen vier Zeilen hinzugefügt. Kannst du mir einen Rat geben? – SungwonAhn

+0

Welchen Fehler zeigt es? – xinaiz

+0

Entschuldigung. Es funktioniert jetzt ^^ Vielen Dank !!!! – SungwonAhn