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)
The partial specialization should be something like this:
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:
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.