【问题标题】:c++ compiling error for interface implementation with template使用模板实现接口的c ++编译错误
【发布时间】:2020-08-02 16:20:29
【问题描述】:

我正在尝试为某些类实现带有模板的接口。我有这样的代码:

文件.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 中使用它时

ma​​in.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&lt;MySpecificClass&gt;::save(MySpecificClass)'

怎么了?

【问题讨论】:

  • 你的意思是纯虚函数virtual void save(T c) = 0;的抽象接口类吗?
  • 是的,使用纯虚函数。谢谢。
  • 那么当您在IFileClass 中将= 0 实际添加到save 的声明时会发生什么?
  • IFileClass 中添加=0 后效果很好。

标签: c++ templates interface


【解决方案1】:

模板不是这里的问题。没有定义的虚函数是。

C++ 标准规定必须定义类的所有非纯虚方法。在您的基类中,您声明一个虚函数保存。如果它不是虚拟的,那么可以不定义它(如果不使用 - 链接器不会抱怨)。

但由于它是虚拟的,因此有一些选项 - 用 {} 给它一个空定义,或者用 =0 使它成为纯虚拟。这两种变体都是合法的,这取决于你想要什么。

【讨论】:

    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多