在定義一個模板類的時候,將類模板成員函數放在獨立的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