Código C++:
Ver originaltemplate <typename D>
class math
{
public:
struct vector{
D x;
D y;
D z;
};
};
Esa declaración está mal. la clase math es un template... pero eso no se aplica a "vector". Y dado que "x", "y" y "z" pertenecen a vector deberías plantearte hacer que "vector" fuese un template.
Creo que lo que tu estás intentando se parece más a esto:
Código C++:
Ver originalnamespace math
{
template <typename D>
struct vector{
D x;
D y;
D z;
};
}
De esta forma, "vector" pasa a formar parte del espacio de nombres "math".
Código C++:
Ver originaltemplate <typename D>
D & operator + (D & a, D & b)
{
math::vector<D> d;
d.x=a.x+b.x;
d.y=a.y+b.y;
d.z=a.z+b.z;
D *ref=d;
return *ref;
}
Lo que pretendes aquí es sumar dos elementos de tipo "vector", luego los parámetros "a" y "b" deberían ser de tipo "vector":
Código C++:
Ver originaltemplate <typename D>
math::vector<D> & operator + (const math::vector<D> & a, const math::vector<D> & b)
{
math::vector<D> d;
d.x=a.x+b.x;
d.y=a.y+b.y;
d.z=a.z+b.z;
D *ref=d;
return *ref;
}
Otro problema que tienes es que el operador no puede devolver una referencia ya que no tienes ningún miembro estático dentro de la función:
Código C++:
Ver originaltemplate <typename D>
math::vector<D> operator + (const math::vector<D> & a, const math::vector<D> & b)
{
math::vector<D> d;
d.x=a.x+b.x;
d.y=a.y+b.y;
d.z=a.z+b.z;
return d;
}
Y creo que con esto ya estaría.
Un saludo.