[英]Why is template typedef an issue in C++ (not C++11)
在这个问题中 ,OP要求提供模板typedef的解决方案,这在C ++中是不可能的。 OP也提出了一个解决方案,但不喜欢它:
template<size_t N, size_t M>
class Matrix {
// ....
};
// Problem - will not compile
typedef Matrix<N,1> Vector<N>;
// Solution
template <int N>
class Vector: public Matrix<N,1>
{ };
我的问题是, Helper::type
解决方案在OP的解决方案上给我们带来了什么好处(假设这些类永远不会被基指针或new
'd这样使用)? 一个空类在释放时应该没有开销(或者是吗?)。 我能看到的唯一缺点是,在调试版本中,您必须在调试时扩展基类。
编辑:除了选定的答案,请参阅@ Dani的答案谁建议继承版本需要定义构造函数,这是一个额外的不便。
这是因为构造函数不是继承的(并且在c ++ 11中不是默认的)。 所以你必须复制所有非默认构造,即使你只是在实现中调用基类构造函数。
typedef
的要点是定义一个类型别名。 子类不是类型别名 - 它是一种新类型。
例如,想象一下库函数
template<size_t N, size_t M>
Matrix<N, M> * createMatrix();
现在有助手类型
Vector<3>::type * var = createMatrix<3, 1>();
是合法的。
继承
Vector<3> * var = createMatrix<3, 1>();
不是。
除了每个人对语法(可能是主观的)的品味之外,主要区别在于,通过inhetirance,vector实际上是另一种衰变为矩阵的类型,而使用包含typedef的帮助器,vector是矩阵的别名(至少对于什么部分专业化适用)。
差异需要向量来重新定义构造函数(不是继承的),或者在模板专业化定义的操作情况下存在一些潜在的陷阱(使用typedef,它们永远不会被视为“不同的”)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.