Метод не найден: шаблоны, виртуальные методы, наследование, полиморфизм

Я довольно новичок в 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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]