2016-04-23 6 views
0

Я пытаюсь определить класс матрицы с простыми операциями. Чтобы скомпилировать с помощью 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; 
} 
+0

Я знаю, как решить эту проблему сейчас. https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Making_New_Friends – Yan

+0

и я подытожил несколько методов для решения этой проблемы. см. здесь: http://blog.csdn.net/yc461515457/article/details/51240348 – Yan

ответ

0

на самом деле, вы можете использовать функцию-член для выполнения задания печати и определить функцию, отличную от члена, которая вызывает эту функцию-член. Итак, вы можете аннулировать использование функции друга в классе шаблона.

что-то вроде этого:

//non-member and non-feriend overload function 
template<typename T> 
std::ostream& operator<<(std::ostream& os, const Mat<T>& m){ 
    m.CoutMat(os);//call member function 
    return os; 
} 

и в определении класса, то есть функция чтобы сделать задание на печать.

//member function to do print job 
void CoutMat(std::ostream& os) const; 

 Смежные вопросы

  • Нет связанных вопросов^_^