首页 > 解决方案 > 模板类作为另一个类中的模板参数

问题描述

所以这是一个我无法得到答案的问题,即使在过去两天搜索了这个网站(和其他网站)之后。

为了论证起见,假设我想创建两个模板类ab。类a只是一个用户定义的数据类型,比如向量或矩阵,所以我可以重载不同的运算符并使使用这些特殊数据类型更容易。类b将把类a作为模板参数(可以认为是向量的二维字段或a表示的任何数据类型),类ab都应该在文件中声明,但在.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.cppbh进行哪些更改以使这个最小的示例工作?

标签: c++classtemplates

解决方案


推荐阅读