c++ - 模板类作为另一个类中的模板参数
问题描述
所以这是一个我无法得到答案的问题,即使在过去两天搜索了这个网站(和其他网站)之后。
为了论证起见,假设我想创建两个模板类a和b。类a只是一个用户定义的数据类型,比如向量或矩阵,所以我可以重载不同的运算符并使使用这些特殊数据类型更容易。类b将把类a作为模板参数(可以认为是向量的二维字段或a表示的任何数据类型),类a和b都应该在头文件中声明,但在.cpp文件中实现。
编辑:我知道模板是有限的,因为我们必须在头文件中实现它们。但我也知道我们可以在编译时定义显式模板参数(如果我们知道将采用哪些模板参数),然后将实现拆分为头文件和.cpp文件。如果我的模板参数是标准 c++ 类型(例如 float、doubles 或 int),这可以正常工作,但是当模板参数是具有模板参数本身的类时,我不知道如何继续,请参阅下面的代码和解释。
在代码形式中,这会像这样
啊
template<class T>
class a {
public:
a(T);
private:
T data;
};
a.cpp
#include <iostream>
#include "a.h"
// explicit template declaration
template class a<double>;
template<class T>
a<T>::a(T in) {
data = in;
}
bh
template< class T>
class b {
public:
b(T);
private:
T item;
};
b.cpp
#include <iostream>
#include "b.h"
// explicit template template declaration
template class b<double>;
template<class T>
b<T>::b(T in) {
item = in;
}
最后是 main.cpp
#include <iostream>
#include "a.h"
#include "b.h"
int main() {
a<double> foo(3); // this works
b<a<double>> bar(foo); // this doesn't
return 0;
}
当我编译并运行上面我得到
main.cpp:7: undefined reference to `b<a<double> >::b(a<double>)'
我一直在修改代码一段时间,我知道问题出在b类上。我试过使用
template<template<class> class T>
代替
template<class T>
我认为这应该是正确的用法(或以类似的形式),但是我遇到了b.cpp文件中的显式模板声明的问题,这只是我对模板的理解。
任何想法应该对b.cpp和bh进行哪些更改以使这个最小的示例工作?
解决方案
推荐阅读
- visual-studio-code - cmakefileapi-parser 关于 windows-VSCode 中 CMake 的警告消息
- python - AttributeError:模块“tensorrt”没有属性“推断”
- spring - 缩放从 Web 容器中执行的 spring-batch 实例
- excel - vba modules on add-in not all available from other workbooks
- mysql - 范围之间的MySql JSON查询
- node.js - 如何正确地将 mongoDB 传递给 Node.js 中的函数
- java - 将 WAR 文件部署到 Jetty:服务器正在运行,但应用程序未启动
- maven - 执行maven Assembly插件的问题
- node.js - 使用 express-session 在 express-ws 中存储会话
- go - 无法使用私有供应商依赖进行构建