c++ - 未找到方法 : Templates, 虚拟方法、继承、多态性

标签 c++ templates inheritance polymorphism virtual-functions

我是 c++ 的新手,我似乎找不到其他人遇到过与我完全相同的问题。基本上,我试图拥有一个我从不直接实例化的抽象类和几个子类。另外,我试图在所有父类(super class)/子类上保持一致的模板。这是我的源文件。我有 3 个实用程序文件和一个用于主要功能的 .cpp 文件。

抽象矩阵.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);
}

我收到错误 undefined reference to `SparseHostMatrix::scale(double)

对于大量代码,我感到很抱歉,我只是很困惑并且已经坚持了一段时间,但没有成功找到关于 SO 或其他方面的解决方案。

最佳答案

模板函数的实现必须在头部。您不能将它放在单独的源文件中。编译器需要在使用函数时查看函数的实际主体,并了解实际的模板参数。

关于c++ - 未找到方法 : Templates, 虚拟方法、继承、多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18368226/

相关文章:

c++ - C++ 中的校验和

javascript - pure.js 必须与现有页面节点一起使用吗?

c++ - 使用模板删除/添加结构成员

C++17 模板推导指南不用于空参数集?

python - 创建从它继承的对象时在 Python 中有条件地导入

python类的继承顺序

java - 如何在没有多重继承的情况下做到这一点

c++ - 如何将十六进制转换为字符串? C++

c++ - 是否可以在没有宏的情况下将语言嵌入到 C++ 中?

c++ - 具有特定模板化类的模板特化