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
派生。
答案 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];
};
但是很难说,因为你不清楚它,你的细胞嵌入了行和列值(神秘地对我来说),所以没有更多的代码,我无法确定。你的设计绝对是奇怪的。