Ver Mensaje Individual
  #5 (permalink)  
Antiguo 20/11/2012, 04:10
Avatar de RsG
RsG
 
Fecha de Ingreso: febrero-2008
Mensajes: 16
Antigüedad: 16 años, 9 meses
Puntos: 0
Respuesta: Fallos a la hora de coimpilar y enlazar archivos con g++

A ver, comento, creo que mi último mensaje se puede olvidar y sigo desde aquí, ya que investigando he realizado algunas modificaciones y creo que la cosa va ligeramente mejor aunque sigue fallando.

Spair.h

Al querer declarar esta clase como plantilla, he visto que tengo que meter todo en el mismo archivo de cabecera .h y me queda tal que así. En este, he echo la trampa de renombrarlo .cc y añadir al final una función main con un simple return 0 y la compilación funcionaba sin darme ningún error por lo que creo que esta, ya está funcionando correctamente y se queda tal que así.

Código:
#include <iostream>

using namespace std;

template <class T, class U>
class spair {
 
  public:

  // Constructor
  spair (T x, U y);
  spair ();

  // Observadores

  T RetAbscisa () const;
  U RetOrdenada () const;

  // Asignacion
  T SetAbscisa (T abs);
  U SetOrdenada(U ord);
  
  private:

  T abscisa;
  U ordenada;
};


template<class T, class U>
spair<T,U>::spair(const T a, const U o){
  abscisa = a;
  ordenada = o;
};

template<class T, class U>
T spair<T,U>::RetAbscisa () const {
	return abscisa;
}

template<class T, class U>
T spair<T,U>::SetAbscisa(T abs){
  abscisa = abs;
}

template<class T, class U>
U spair<T,U>::RetOrdenada () const {
	return ordenada;
}

template<class T, class U>
U spair<T,U>::SetOrdenada (U ord){
	ordenada = ord;
}
Punto.h

Código:
#include <iostream>
#include <nspair.h> // La nueva versión de Spair la he llamado nspair.h de ahí el cambio

//using namespace std;


class punto
{
  public:
    // constructores
    punto (); 		  	// punto (0,0)
    punto (const int x, const int y);	// punto (x,y)
    punto (const punto & rhs);

    // asignacion
    void operator = (const punto & rhs);

    // observadores
    int abcisa () const;
    int ordenada () const;

  private:
    // area de datos
    // Un par de enteros (x:ordenada, y:abcisa)
    spair<int, int> data;

};
Punto.cc

Aquí es donde estoy encontrandome el problema, ya que no se si estoy usando correctamente el constructor. Ya que punto, quiero que se base en la declaración de Spair e igual estoy metiendo la pata a la hora de implementarlo

Código:
#include <punto.h>


punto::punto(const int a, const int o){
  data = spair<int,int> (a,o);
};
El error que me da al compilar es el siguiente

Código:
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: En la función `_start':
(.text+0x20): referencia a `main' sin definir
/tmp/cc6F2l2c.o: En la función `punto::punto(int, int)':
punto.cc:(.text+0x1a): referencia a `spair<int, int>::spair()' sin definir
collect2: error: ld devolvió el estado de salida 1
Y luego por último, tengo Programa.cc que si lo compilo me sigue dando una lista interminable de errores aunque creo que la mayoría son porque está mal compilado punto y falla a la hora de realizar el enlazado.

Seguiré investigando sobre esta nueva versión que estoy haciendo.

Gracias, un saludo y perdón por las molestias, solo quiero aprender!