【问题标题】:template class inheritance rules模板类继承规则
【发布时间】:2015-01-24 19:27:42
【问题描述】:
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&lt;T&gt; 的矩阵类。

这行得通:

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

【问题讨论】:

  • 这毫无意义,编译器怎么知道 T 是什么?你想要class matrix:public cell&lt;double&gt; 吗?或class matrix:public cell&lt;int&gt;? ...
  • 为什么不希望matrix 访问T
  • 矩阵可以由包含浮点/整数值的单元格组成...想法是让单元格处理该信息。
  • @basav 那么matrix 必须是一个模板。否则您将不知道您希望单元格是什么类型。
  • 有道理。我会继续。

标签: c++ templates inheritance


【解决方案1】:

是的,在将模板类cell&lt;T&gt; 实例化为matrix 的基类时,您必须选择一个实际类型。如果matrix 不是模板,则没有为matrix 的任何实例提供类型灵活性,因此cell&lt;T&gt; 的类型T 必须在matrix 的定义中完全已知。例如,这将起作用:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 你可以有一个矩阵,它的单元格由浮点值/整数值组成......因此,我正在尝试模板......我正在学习模板的使用
    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2018-01-18
    • 2011-03-22
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多