模板类继承规则

template class inheritance rules

本文关键字:规则 继承      更新时间:2023-10-16
template<typename T>
struct cell
{
    cell(T row,T column)
    {
        cellid = std::make_pair<T, T>(row, column);
    }
    std::pair<T, T> getcellid();
private:
    std::pair<T, T> cellid;
};

现在,我有一个派生自cell<T>的矩阵类。

这有效:

template<typename T>
class matrix : public cell<T>
{
};

这不起作用:

class matrix : public cell<T>
// Error: T does not name a type

这是可以理解的。

方法 1 的缺点是,matrix类现在可以使用模板参数T,这在本用例中不会发生。

有没有办法阻止matrix类访问模板参数,同时仍然能够从类cell派生。

是的,在实例化模板类cell<T>作为matrix的基类时,您必须选择实际类型。如果matrix不是模板,那么没有为matrix的任何实例化提供类型灵活性,因此在matrix的定义中必须完全知道cell<T>的类型T。例如,这将起作用:

class matrix : public cell<int> { ... };

我认为您对模板的工作原理存在根本性的误解。

基本上不可能编写一个有用的matrix类,而不能提及其单元格的类型T。您无法返回单元格值或对单元格执行计算。

您编写的"工作"类定义是您需要使用的。"不起作用"的定义对编译器或我都不明智。

但是,无论如何,将矩阵创建为单个单元格的子类可能不是您实际想要的设计。矩阵是由多个单元格组成的数组,而不是特殊类型的单元格。你可能想要这样的东西。

class matrix
{
     cell<float>  c[3][3];
};

但是很难说,因为您不清楚它,并且您的单元格嵌入了行和列值(对我来说很神秘),因此没有更多代码,我无法确定。不过你的设计绝对很奇怪。