模板类继承规则

时间:2015-01-24 19:27:43

标签: c++ templates inheritance

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派生。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我认为你对模板的运作方式存在根本性的误解。

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

您编写的“工作”类定义是您需要使用的。 “不工作”定义对编译器或我来说都不敏感。

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

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

但是很难说,因为你不清楚它,你的细胞嵌入了行和列值(神秘地对我来说),所以没有更多的代码,我无法确定。你的设计绝对是奇怪的。