Ver Mensaje Individual
  #2 (permalink)  
Antiguo 07/10/2014, 14:58
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Duda con sobrecarga de operadores, estructuras y punteros.

Código C++:
Ver original
  1. template <typename D>
  2. class math
  3. {
  4.     public:
  5.     struct vector{
  6.         D x;
  7.         D y;
  8.         D z;
  9.     };
  10. };

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 original
  1. namespace math
  2. {
  3.   template <typename D>
  4.   struct vector{
  5.         D x;
  6.         D y;
  7.         D z;
  8.     };
  9. }

De esta forma, "vector" pasa a formar parte del espacio de nombres "math".

Código C++:
Ver original
  1. template <typename D>
  2. D & operator + (D & a, D & b)
  3. {
  4.     math::vector<D> d;
  5.  
  6.     d.x=a.x+b.x;
  7.     d.y=a.y+b.y;
  8.     d.z=a.z+b.z;
  9.  
  10.     D *ref=d;
  11.  
  12.     return *ref;
  13. }

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 original
  1. template <typename D>
  2. math::vector<D> & operator + (const math::vector<D> & a, const math::vector<D> & b)
  3. {
  4.     math::vector<D> d;
  5.  
  6.     d.x=a.x+b.x;
  7.     d.y=a.y+b.y;
  8.     d.z=a.z+b.z;
  9.  
  10.     D *ref=d;
  11.  
  12.     return *ref;
  13. }

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 original
  1. template <typename D>
  2. math::vector<D> operator + (const math::vector<D> & a, const math::vector<D> & b)
  3. {
  4.     math::vector<D> d;
  5.  
  6.     d.x=a.x+b.x;
  7.     d.y=a.y+b.y;
  8.     d.z=a.z+b.z;
  9.  
  10.     return d;
  11. }

Y creo que con esto ya estaría.

Un saludo.