我对c ++很新,我似乎无法找到与我有完全相同问题的其他人。基本上,我正在尝试一个我从不直接实例化的抽象类,以及几个子类。此外,我正在尝试在所有超级/子类上保持一致的模板。这是我的源文件。我有3个实用程序文件和一个主函数的.cpp文件。
abstract_matrix.h
#ifndef ABSTRACTMATRIX
#define ABSTRACTMATRIX
template<class T>
class DataMatrix {
public:
int numFeatures;
int numPoints;
T* data;
T* classifications;
virtual void scale(T scalar) = 0;
};
#endif
这是我的抽象类的子类声明,sparse_host_matrix.h
#ifndef SPARSEHOSTMATRIX
#define SPARSEHOSTMATRIX
#include <iostream>
template<class T>
class SparseHostMatrix : public DataMatrix<T> {
public:
void scale(T scalar);
};
#endif
这是这些功能的实现..
#include "sparse_host_matrix.h"
#include <iostream>
template<class T>
void SparseHostMatrix<T>::loadFromFile(char* filename) {
std::cout << "Loading in sparseHostMatrix" << std::endl;
}
template<class T>
void SparseHostMatrix<T>::scale(T scalar) {
std::cout << "Loading in sparseHostMatrix" << std::endl;
}
当我运行这个主要功能时......
#include <iostream>
using namespace std;
#include "abstract_matrix.h"
#include "sparse_host_matrix.h"
int main() {
DataMatrix<double> *myMat = new SparseHostMatrix<double>;
myMat->scale(.5);
}
我得到错误未定义的引用`SparseHostMatrix :: scale(double)
对于大量的代码感到抱歉,我只是非常困惑,并且在没有成功找到SO或其他方面的解决方案的情况下已经坚持了一段时间。
答案 0 :(得分:2)
模板函数的实现必须在标题中。您不能将其放在单独的源文件中。编译器需要在使用函数的位置查看函数的实际主体,并且实际模板参数已知。