如何在C++的模板中使用类作为参数
How to use a class as parameter in templates in C++
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:对不起,我的英语不好。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用