混合部分模板特化和默认模板参数
我想创建一个通用向量类并为一些情况创建专业化。像这样的东西(它不会编译,但希望传达我的意图):
template<int dim, typename T = float>
class Vector
{
public:
typedef Vector<dim, T> VecType;
Vector() { /**/ }
Vector(const VecType& other) { /**/ )
Vector& operator=(const VecType& other) { /**/ }
VecType operator+(const VecType& other) { /**/ }
VecType operator-(const VecType& other) { /**/ }
T operator*(const VecType& other) { /**/ }
private:
std::array<T, dim> elements;
};
template<int dim, typename T>
class Vector<2>
{
public:
T x() const { return elements[0]; }
T y() const { return elements[1]; }
};
template<int dim, typename T>
class Vector<3>
{
public:
T x() const { return elements[0]; }
T y() const { return elements[1]; }
T z() const { return elements[2]; }
};
换句话说,我希望元素的默认类型为 float
并且我希望有 x()<
dim = 2
情况的 /code> 和 y()
访问器方法,以及 x()
、y() 和
z()
为dim = 3
案例。我对错误消息有点困惑:
vector.h:56:10: 错误:声明“int dim”
vector.h:6:10:错误:阴影模板参数“int dim”
(与 T
相同)。
我怎样才能正确地做到这一点? (如果可能的话)
I would like to create a generic vector class and create specializations for a few cases. Something like this (it does not compile, but hopefully communicates my intentions):
template<int dim, typename T = float>
class Vector
{
public:
typedef Vector<dim, T> VecType;
Vector() { /**/ }
Vector(const VecType& other) { /**/ )
Vector& operator=(const VecType& other) { /**/ }
VecType operator+(const VecType& other) { /**/ }
VecType operator-(const VecType& other) { /**/ }
T operator*(const VecType& other) { /**/ }
private:
std::array<T, dim> elements;
};
template<int dim, typename T>
class Vector<2>
{
public:
T x() const { return elements[0]; }
T y() const { return elements[1]; }
};
template<int dim, typename T>
class Vector<3>
{
public:
T x() const { return elements[0]; }
T y() const { return elements[1]; }
T z() const { return elements[2]; }
};
In other words, I want the default type of the elements to be float
and I want to have x()
and y()
accessor methods for the dim = 2
case, and x()
, y()
and z()
for the dim = 3
case. I'm a little confused by the error messages:
vector.h:56:10: error: declaration of ‘int dim’
vector.h:6:10: error: shadows template parm ‘int dim’
(same for T
).
How can I do this correctly? (if it's possible)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
1.
当部分特化模板时,仅提供实际上是参数的模板参数。由于您已将
dim
固定为 2 或 3,因此无需再次指定它。2.
专门化一个类实际上意味着更改整个声明。因此,通用
Vector
的成员在专用Vector<2, T>
中不可用。您可以将通用Vector
作为内部基类,并创建一个子类以进行专门化:3.
您不需要定义
VecType
!在模板中,您可以只使用Vector
。它将自动推断出引用具有正确参数的类。最终编译结果:
1.
When partially specializing a template, only supply the template parameters that are actually a parameter. Since you've already fixed
dim
to be 2 or 3, there's no need to specify it again.2.
Specializing a class really means changing the whole declaration. Therefore, the members s of the generic
Vector<dim, T>
will not be available in the specializedVector<2, T>
. You could make the genericVector<dim, T>
as into an internal base class, and create a subclass just for specialization:3.
You don't need to define
VecType
! Inside a template, you could just useVector
. It will automatically be deduced to refer to the class with the right parameters.The end result that compiles:
部分专业化应该是这样的:
The partial specialization should be something like this:
你可以这样做:
这可以在 gcc 4.5.2 中编译(不要运行它......)。
但是,这样,您将无法在特化中使用主模板中定义的成员函数的任何成员变量。
You can do it like this:
This can compile in gcc 4.5.2 (Don't run it ...).
However, in this way, you will not be able to use any of the member variable of member function define in your main template in the specialization.