Ошибка компиляции c ++ для реализации интерфейса с шаблоном - PullRequest
1 голос
/ 02 августа 2020

Я пытаюсь реализовать интерфейс с шаблоном для некоторого класса. У меня есть такой код:

file.h

#pragma once;

class MySpecificClass {
    std::string data;
    unsigned int x;
    unsigned int y;
    unsigned int z;

public:
    MySpecificClass(): data(""), x(0), y(0), z(0) {
    }
    MySpecificClass(std::string s, unsigned int xx, unsigned int yy, unsigned zz) : data(s), x(xx), y(yy), z(zz) {
    }
};

template <class T>
class IFileClass {
public:
    IFileClass(std::string f) : fileName(f) {
    }
    virtual void save(T c);
protected:
    std::string fileName;
};

template <class T>
class FileWithClass : public IFileClass<T> {
public:
    FileWithClass(std::string fn) : IFileClass<T>(fn) {
    }
    void save(T c) override {
        std::cout << "FileWithClass save" << std::endl;
    }
};

Когда я пытаюсь использовать его в основном

main. cpp

#include "file.h"
int main() {
    // create object to save
    MySpecificClass msc = {"My Test", 100, 200, 300};
    FileWithClass<MySpecificClass> fsv = {"test.txt"};
    fsv.save(msc);
}

Я получаю такую ​​ошибку компиляции:

undefined reference to `IFileClass<MySpecificClass>::save(MySpecificClass)'

Что не так?

1 Ответ

2 голосов
/ 03 августа 2020

Здесь проблема не в шаблоне. Виртуальная функция без определения - это.

Стандарт C ++ указывает, что должны быть определены все виртуальные методы класса, которые не являются чисто виртуальными. В вашем базовом классе вы объявляете сохранение виртуальной функции. Если бы он не был виртуальным, было бы нормально оставить его без определения (если он не используется - компоновщик не будет жаловаться). пустое определение с помощью {} или сделать его чисто виртуальным с помощью = 0. Оба варианта допустимы в зависимости от того, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...