使用C++類模板,出現鏈接錯誤

在定義一個模板類的時候,將類模板成員函數放在獨立的cpp實現文件中,將模板類聲明放在一個h文件中。在一個文件中需要使用到這個類,直接include頭文件發現出現鏈接錯誤。

由於模板不是函數,只是一些C++編譯器指令,說明了如何生成類和成員函數定義,無法單獨編譯成obj文件,因此不能將模板成員函數放在獨立的實現文件中。模板必須與特定的模板實例化請求一起使用,最簡單的方法是將所有的模板信息放在一個頭文件中,並在要使用這些模板的文件中包含該頭文件。

錯誤示例代碼:

/*matrix.h*/
#ifndef _MATRIX_
#define _MATRIX_

#include <iostream>
#include <vector>
#include <assert.h>

template<typename T>
class Matrix {
  int row, col;
  std::vector<std::vector<T> > mem;

public:
  Matrix();
  ~Matrix();
  Matrix(T **arr, int n, int m);
  void display();

};

#endif
/*matrix.cpp*/
#include "matrix.h"

template<typename T>
Matrix<T>::Matrix()
{
}

template<typename T>
Matrix<T>::~Matrix()
{
}

template<typename T>
Matrix<T>::Matrix(T **arr, int n, int m)
{
  using std::vector;
  assert(n >= 0 && m >= 0 && arr);
  mem = vector<vector<T> >(n, vector<T>(m));
  for (int i = 0; i < n; ++i) 
    for (int j = 0; j < m; ++j) 
      mem[i][j] = arr[i][j];
  this->row = n;
  this->col = m;
}

template<typename T>
void Matrix<T>::display()
{
  for (auto &v: mem) {
    for (auto &e: v)
      std::cout << e << " ";
    std::cout << "\n";
  }
}
#include <iostream>
#include <vector>
#include <stdlib.h>
#include "matrix.h"

int * newIntRaw(int n)
{
  return (int *)malloc(sizeof(int) * n); 
}

int ** newMap(int n, int m)
{
  int **pMap = (int **)malloc(sizeof(int *) * n);
  for (int i = 0; i < n; ++i)
    pMap[i] = (int *)malloc(sizeof(int) * m);
  return pMap;
}


int main()
{
  int row, col;
  std::cin >> row >> col;
  int **pMap = newMap(row, col);
  // cut
  Matrix<int> matrix(pMap, row, col); //鏈接錯誤,找不到函數實現
  matrix.display();
  // free map
  return 0;
}
main: main.o matrix.o
    g++ -std=c++11 main.o matrix.o -o main
main.o: main.cpp
    g++ -std=c++11 -c main.cpp -o main.o
matrix.o: matrix.cpp
    g++ -std=c++11 -c matrix.cpp -o matrix.o

clean:
    rm *.o main
run:
    ./main

hui@hui-Lenovo-V1000:~/project/cpp$ make
g++ -std=c++11 -c main.cpp -o main.o
g++ -std=c++11 -c matrix.cpp -o matrix.o
g++ -std=c++11 main.o matrix.o -o main
main.o:在函數‘main’中:
main.cpp:(.text+0xe0):對‘Matrix::Matrix(int**, int, int)’未定義的引用
main.cpp:(.text+0xef):對‘Matrix::display()’未定義的引用
main.cpp:(.text+0x103):對‘Matrix::~Matrix()’未定義的引用
main.cpp:(.text+0x124):對‘Matrix::~Matrix()’未定義的引用
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target ‘main’ failed
make: * [main] Error 1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章