C++ 如何用模板加密的类继承模板抽象类

C++ 如何用模板加密的类继承模板抽象类,c++,templates,inheritance,abstract-class,C++,Templates,Inheritance,Abstract Class,我在linux上有一个构建到静态库中的项目,然后我想将它包含在单元测试项目和应用程序项目中 在这个图书馆里,我有这样的东西: 模板类别A { 公众: 虚拟T doStuff()=0; 虚空涂鸦(ta)=0; 受保护的: A(){…} }; B类:公共A { 公众: B(){…} 虚拟int-doStuff(){…} 虚空涂鸦(inta){…} }; 我收到编译错误:未定义对库中A::A()的引用。 我猜这与模板生成有关,我也可以像那样重写虚拟函数吗?模板是在编译时生成的,需要在原型相同的翻译

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

在这个图书馆里,我有这样的东西:

模板类别A
{
公众:
虚拟T doStuff()=0;
虚空涂鸦(ta)=0;
受保护的:
A(){…}
};
B类:公共A
{
公众:
B(){…}
虚拟int-doStuff(){…}
虚空涂鸦(inta){…}
};
我收到编译错误:
未定义对库中A::A()
的引用。
我猜这与模板生成有关,我也可以像那样重写虚拟函数吗?

模板是在编译时生成的,需要在原型相同的翻译单元中实现。因此,如果要包含模板类的声明,还需要包含定义

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

参考:

14.7.2显式实例化[临时显式]

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


. 请提供一个复制问题的方法。是的,您可以覆盖这样的虚拟函数。如果没有,编译器会告诉您。@Angew-我的类成员定义在cpp文件中,而不是像本例中那样的头文件中。我认为这完全无关,完全忘记了基本的东西。你能解释一下你所引用的内容的相关性吗?问题代码中没有明确的实例化。即使您将该部分加粗,这也不会改变以下事实:引号引用的语言结构根本没有出现在问题代码中(
a
不是明确的实例化),因此您根本不清楚要说什么。如果OP的问题是由于在使用模板时没有包含定义造成的,那么显式实例化可能是一个解决方案,但您需要对此进行解释。我完全忘记了这一部分-我经常进行重构,并认为我确实在.h文件中包含了我的.cpp(使用
#ifndef MY_CPP
#define MY_CPP
..
#endif
)当我现在这样做时,它解决了我的问题。使用模板编程已经很久了,这些错误可能更具体;p
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) { ... }

};