所以这是一个问题,即使过去两天都在搜索此网站(和其他网站)后也无法得到答案。
为便于讨论,假设我要创建两个模板类 a 和 b 。类 a 只是用户定义的数据类型,例如向量或矩阵,因此我可以重载不同的运算符,并简化使用这些特殊数据类型的工作。类 b 将采用类 a 作为模板参数(可以认为是矢量的2D字段或任何数据类型 a 表示)并且 a 和 b 类都应在 header 文件中声明,但应在 .cpp 文件中实现。
编辑:在我们必须在 header 文件中实现它们的意义上,我知道模板的局限性。但我也知道,我们可以在编译时定义显式模板参数(如果我们知道将采用哪些模板参数),然后将实现分为 header 和 .cpp 文件。如果我的模板参数是标准的c ++类型(例如float,doubles或int),则效果很好,但是当模板参数本身是带有模板参数的类时,我不知道如何继续操作,请参见以下代码及其说明。
以代码形式,这会引起类似这样的声音
a.h
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;
}
b.h
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 和 b.h 进行更改,以使此最小示例生效?