Смешивание частичной специализации шаблона и параметров шаблона по умолчанию

Я хотел бы создать общий класс вектора и создать специализации для нескольких случаев. Что-то вроде этого (это не компилируется, но, надеюсь, передает мои намерения):

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() и y() методы доступа для случая dim = 2, и x(), y() и z() для случая dim = 3. Меня немного смущают сообщения об ошибках:

vector.h:56:10: error: declaration of 'int dim'

vector.h:6:10: error: shadows template parm 'int dim'

(то же самое для T).

Как правильно это сделать? (если это возможно)

6
задан Tamás Szelei 27 December 2011 в 13:20
поделиться