Я пытаюсь определить класс матрицы с простыми операциями. Чтобы скомпилировать с помощью int, float, double data type, я использую шаблон. И я перегружаю оператор «< <» для печати матрицы. Как бы то ни было, когда я скомпилирую программу, я получаю ошибку LNK2019.ошибка при определении моего класса матрицы C++ с использованием типа данных шаблона и перегрузки оператора «<<»
Ошибка 2 Ошибка LNK1120: 1 неразрешенных внешних
Ошибка 1 Ошибка LNK2019: неразрешенный внешний символ "оператор класса станд :: basic_ostream> & __cdecl < < (класс станд :: basic_ostream> &, класс Mat Const &)" (6 @ YAAAV? $ Basic_ostream @ DU? $ Char_traits @ D @ std @@@ std @@ AAV01 @ ABV? $ Mat @ H @@@ Z) ссылка в функции _main
Я попытался найти ошибки и просто не мог понять проблему.
Вот деталь: система Информационное: окна 10 x64, Visual Studio 2013
mat.h файл
#ifndef _MAT_H_
#define _MAT_H_
#include <iostream>
#include <ostream>
#include <sstream>
#include <vector>
#include <cstring>
#include <cassert>
//implement Mat class in c++
template<typename T>
class Mat{
friend std::ostream& operator<<(std::ostream &os, const Mat<T> &m);
friend std::istream& operator>>(std::istream &is, Mat<T> &m);
public:
//construct
Mat();
Mat(size_t i, size_t j);
//destructor
~Mat();
//access element value
T& MatVale(size_t i, size_t j);
const T& MatVale(size_t i, size_t j) const;
//get row and col number
const size_t rows() const{ return row; }
const size_t cols() const{ return col; }
private:
size_t row;
size_t col;
T* pdata;
};
#endif
mat.cpp файл
`
#include "mat.h"
using std::cout;
using std::endl;
using std::istream;
using std::ostream;
template<typename T>
ostream& operator<<(ostream &os, const Mat<T>&m){
for (int i = 0; i < m.row; i++){
for (int j = 0; j < m.col; j++){
os << m.pdata[i*m.col + j] << " ";
}
os << std::endl;
}
os << std::endl;
return os;
}
template<typename T>
istream& operator>>(istream &is, Mat<T>&m){
for (int i = 0; i < m.row; i++){
for (int j = 0; j < m.col; j++){
is >> m.pdata[i*m.col + j];
}
}
return is;
}
//construct
template<typename T>
Mat<T>::Mat(){
cout << "defalut constructor" << endl;
row = 0;
col = 0;
pdata = 0;
}
template<typename T>
Mat<T>::Mat(size_t i, size_t j){
row = i; col = j;
pdata = new T[row*col];
std::memset(pdata, 0, row*col*sizeof(T));
}
//destructor
template<typename T>
Mat<T>::~Mat(){
if (pdata) delete[] pdata;
}
//access element value
template<typename T>
inline T& Mat<T>::MatVale(size_t i, size_t j){
assert(pdata && i>=0 && j>=0 && i < row && j < col);
return pdata[i*col + j];
}
template<typename T>
inline const T& Mat<T>::MatVale(size_t i, size_t j) const{
assert(pdata && i >= 0 && j >= 0 && i < row && j < col);
return pdata[i*col + j];
}
int main(){
Mat<int> mat1(7, 2);
Mat<int> mat2(7, 2);
for (size_t i = 0; i < mat1.rows(); i++){
for (size_t j = 0; j < mat1.cols(); j++){
mat1.MatVale(i, j) = i + j+3;
mat2.MatVale(i, j) = 2 * i + j+11;
}
}
std::cout << mat1;//comment this line then it is okay.
return 1;
}
Я знаю, как решить эту проблему сейчас. https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Making_New_Friends – Yan
и я подытожил несколько методов для решения этой проблемы. см. здесь: http://blog.csdn.net/yc461515457/article/details/51240348 – Yan