2016-04-01 64 views
2

當我嘗試編譯下面的代碼,我得到一個錯誤說模板矩陣標量乘C++

錯誤1個錯誤LNK2019:無法解析的外部符號「類矩陣__cdecl的operator *(INT常量&,類矩陣& )在函數_main C:\ Users \ pc \ Documents \ Visual Studio 2013 \ Projects \ Homework4 \ Homework4 \ main.obj中引用的「(?? D @ YA?AV?$ Matrix @ H $ 02 $ 01 @@ ABHAAV0 @@ Z)作業4

這個錯誤發生在矩陣上的標量乘,我不知道如何解決它。任何人都可以給我一個建議嗎?

//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(); 
} 

我認爲錯誤來自於類的身體的友元函數(操作*),但我不知道如何解決它......因爲 一個發生

回答

1

錯誤)operator*被聲明爲非模板(您應該使用<>) b)如果使用<>語法,則必須提供模板的聲明。

修復 (添加Matrix類前):

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 

添加<>operator*friend聲明:

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

謝謝你的答案。不幸的是,我做了你告訴我要做的事情,它仍然給我一個錯誤。我從「const T&」中刪除了「const」,並添加了<>。另外,我添加了前四行。你能給我一個建議嗎? – SungwonAhn

+0

它顯示了什麼錯誤? – xinaiz

+0

對不起。它正在工作^^非常感謝! – SungwonAhn