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)
1.
When partially specializing a template, only supply the template parameters that are actually a parameter. Since you’ve already fixed
dimto 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: