【问题标题】:How to inherit template abstract class with a class with template secification如何用具有模板规范的类继承模板抽象类
【发布时间】:2015-06-17 01:50:33
【问题描述】:

我有一个在 linux 上构建到静态库的项目,然后我想将其包含在单元测试项目和应用程序项目中。

在这个库中,我有类似的东西:

template<class T> class A
{
public: 
    virtual T doStuff() = 0;
    virtual void doOther(T a) = 0;
protected:
    A() { ... }
};

class B : public A<int>
{
public:
    B() { ... }
    virtual int doStuff() { ... }
    virtual void doOther(int a) { ... }

};

我收到编译错误:undefined reference to A&lt;int&gt;::A() 在我的库中。 我猜它与模板生成有关,我也可以像这样覆盖虚函数吗?

【问题讨论】:

  • Works for me。请提供重现问题的MCVE
  • 是的,你可以像这样重写虚函数。如果没有,编译器会通知您。
  • @Angew - 我在 cpp 文件中定义了我的班级成员,而不是像这里示例中的头文件。我认为这完全无关紧要,完全忘记基本的东西。

标签: c++ templates inheritance abstract-class


【解决方案1】:

模板是在编译期间生成的,需要在它们原型化的同一个翻译单元中实现。因此,如果要包含模板类的声明,则还需要包含定义。

因此,谨慎的做法是将声明和定义放在同一个头文件中,这样,任何打算使用它的模块在编译时都可以根据需要生成定义。

参考:

14.7.2 显式实例化 [temp.explicit]

对于给定的模板参数集,如果显式实例化 模板出现在显式特化声明之后 对于该模板,显式实例化无效。 否则,对于显式实例化定义的定义 函数模板、成员函数模板或成员函数 或类模板的静态数据成员应存在于每个 在其中显式实例化它的翻译单元。

【讨论】:

  • 您能解释一下您引用的报价的相关性吗?问题代码中没有明确的实例化。
  • 即使您将该部分设为粗体,这也不会改变这样一个事实,即引号所指的语言结构根本不会出现在问题代码中(A&lt;int&gt;not 一个明确的实例化),所以根本不清楚你想说什么。如果 OP 的问题是由于使用模板时不包含定义引起的,则显式实例化可能是一种解决方案,但您需要这样解释。
  • 我完全忘记了那部分 - 重构了很多,并认为我确实将我的 .cpp 包含在 .h 文件中(使用 #ifndef MY_CPP #define MY_CPP ... #endif)当我这样做时现在,它解决了我的问题。使用模板编程很久了,这些错误可能更具体;p
猜你喜欢
  • 2019-11-25
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多