Why can templates only be implemented in the header file? (17个答案)
4年前关闭。
我知道还发布了类似这样的其他问题,但就我而言,我正在做这些问题的答案中的所有工作,但仍然收到未定义的引用错误。这是
main.cpp
:
#include "mainHeader.hpp"
int main() {
Matrix2D<int> matrix2(3,3);
matrix2(2,2) = 99; // produces an error
return 0;
}
这是
mainHeader.hpp
:
#ifndef _MAINHEADER_HPP
#define _MAINHEADER_HPP
#include <iostream>
#include <vector>
template <class T>
class Matrix2D {
private:
std::vector< std::vector<T> > matrix;
public:
/* Constructors */
Matrix2D(unsigned int numberOfRows = 1, unsigned int numberOfColumns = 1) : matrix( std::vector< std::vector<T> >(numberOfRows, std::vector<T>(numberOfColumns)) ) {}
/* Operator overloads */
T & operator () (unsigned int, unsigned int);
};
#endif // _MAINHEADER_HPP
最后,这是
matrixClass.cpp
:
#include "mainHeader.hpp"
// Overload the () operator
template <class T>
T & Matrix2D<T>::operator () (unsigned int row, unsigned int column) {
return matrix[row][column];
}
我使用
g++ -std=c++11 -Wall -g main.cpp matrixClass.cpp -o output
编译(在Linux Mint 64位上),但出现错误:
/tmp/ccoSx71n.o: In function `main':
/home/.../main.cpp:7: undefined reference to `Matrix2D<int>::oper
ator()(unsigned int, unsigned int)'
collect2: error: ld returned 1 exit status
我不明白问题是什么,请帮忙。谢谢!