如何在C++的模板中使用类作为参数

How to use a class as parameter in templates in C++

本文关键字:参数 C++      更新时间:2023-10-16

A:我使用这样的东西:

在 1.h 类中:

template <class T>
class Class1 : Database {
public:
    Class1();
};

在 1 类.cpp:

#include "Class1.h"
template <typename T>
Class1<T>::Class1(){
   //Some code
}

调用类:

#include "Class1.h"
Class1<Class2> *class1 = new Class1<Class2>();

如果我运行这个,链接器找不到"Class1"。

乙:当我使用这样的东西时:

#include "Class1.h"
template <> Class1<Class2>::Class1(){}

链接器能够找到它。

我的问题是,我需要在我的代码中使用 A 而不是 B。

这意味着我不想使用:

template <> Class1<Class2>::Class1(){}

我只想使用:

template <typename T>
Class1<T>::Class1(){
   //Some code
}

所有教程都说我正确使用它,它必须工作。有人可以帮助我吗?

当您尝试实例化类模板的专用化时,编译器需要有权访问每个成员定义,否则它无法生成相应的代码(C++模板基本上是类固醇上的 copypasta 工厂(。

由于您将实现详细信息拆分到一个单独的文件中,因此无法实例化您的特定专用化(即 a.k.a(。 Class1<Class2> .我想你把template <> Class1<Class2>::Class1() {}位放在头文件中?如果是这样,则编译代码是因为当您在示例中使用它时,它具有完全专用化Class2与可用构造函数。

示意性地,你有:

模板标头 -> 包含在 -> 测试示例 cpp 文件中
\----------------------->包含在 -> 模板实现 cpp 文件中

您可以看到,在测试示例翻译单元中无法访问模板的所有实际实现。

如注释中所述,Class1是一个模板化类,因此您应该将构造器放在头文件中,而不是单独的 cpp 文件中。否则,可以将构造函数放在使用它的 cpp 文件中,但前提是仅在单个 cpp 文件中使用它。

问题是当你写的时候

Class1<Class2> *class1 = new Class1<Class2>();

你要求编译器调用(并构造(Class1<Class2>的构造函数,但编译器不知道如何构造它,因为它是在另一个文件中定义的(编译器,在这个阶段,只看到"Class1.h";不知道"Class1.cpp"的内容(。

您的解决方案 B

template <> Class1<Class2>::Class1(){}

工作是因为您正在为Class1<Class2>定义构造函数专用化,因此编译器知道它

解决方案:删除

template <typename T>
Class1<T>::Class1(){
   //Some code
}

从"Class1.cpp"中放入"Class1.h"。

PS:对不起,我的英语不好。