Duda c++

En el compilador g++ como debía poner la opción -I para que me encuentre los ficheros h?? era algo como -I ,
es que trato de compilar unos ficheros y no me los encuentra, estoy porbando con
g++ -o prueba templ.cpp prueba.cpp -I .* pero no es asi

este es templ.h
#ifndef NUMERO
#define NUMERO
#include <iostream>
using namespace std;

template<typename T>
class Numero{
   public:
      Numero(T n);
      T& getN();
   private:
      T n_;
};
#endif


este es templ.cpp
#include "templ.h"

template<typename T>
Numero<T>::Numero(T n):n_(n){};

template<typename T>
T& Numero<T>::getN(){ return n_;}


y este es prueba.cpp
#include "templ.h"
int main(){
   Numero<int> n(5);
   cout<<n.getN()<<endl;
}


Para que compile con esta orden g++ -o prueba templ.cpp prueba.cpp en prueba.cpp tengo que incluir el templ.cpp no el templ.h :-? pero si sincluyo el templ.h en prueba.cpp me dice ....referencia sin definir en main()
este es el error
/tmp/ccd5stS2.o: En la función `main':
prueba.cpp:(.text+0x15): referencia a `Numero<int>::Numero(int)' sin definir
prueba.cpp:(.text+0x21): referencia a `Numero<int>::getN()' sin definir
collect2: error: ld returned 1 exit status
Buenas,

Tienes todos los ficheros en la misma carpeta? Esta claro que no te detecta la clase, pero en principio la compilación sólo debe lanzarse con los .cpp:

g++ -o prueba templ.cpp prueba.cpp


Aqui te dejo un enlace a StackOverFlow donde lo explican: http://stackoverflow.com/questions/3202136/using-g-to-compile-multiple-cpp-and-h-files

Espero que te sirva!
Saludos.
¿tienes el templ.h en el directorio en el que está el .cpp principal? Si no es así, tienes que poner una ruta relativa en plan #include "../modulob/templ.h"

carlinhos1 escribió:Buenas,

Tienes todos los ficheros en la misma carpeta? Esta claro que no te detecta la clase, pero en principio la compilación sólo debe lanzarse con los .cpp:

Saludos.


Discrepo, los ficheros .h son para compilar linkando con ficheros objeto ( o librerías o como le quieras llamar ) .

De hecho, salvo que definas directivas o estructuras en los .h , no te harían falta.
Estando los .h en el mismo directorio que los .cpp, compila así:

g++ -o prueba -I. templ.cpp prueba.cpp

Te recomiendo que aprendas a usar la herramienta make paraestos temas.
squarewave escribió:¿tienes el templ.h en el directorio en el que está el .cpp principal? Si no es así, tienes que poner una ruta relativa en plan #include "../modulob/templ.h"

carlinhos1 escribió:Buenas,

Tienes todos los ficheros en la misma carpeta? Esta claro que no te detecta la clase, pero en principio la compilación sólo debe lanzarse con los .cpp:

Saludos.


Discrepo, los ficheros .h son para compilar linkando con ficheros objeto ( o librerías o como le quieras llamar ) .

De hecho, salvo que definas directivas o estructuras en los .h , no te harían falta.


Me referia a este caso concreto compañero, considerando que tanto .h como .cpp estaban en la misma carpeta que desde donde se compilaba!

A ver si viene el afectado y nos comenta!

Saludos.
Las clases y funciones paramétricas deben estar totalmente definidas en los ficheros de cabecera para que el compilador pueda generar las versiones necesarias según el tipo con el que las declares en tu código. En otras palabras: mete el constructor y el método getN en el .h y borra el .cpp.

Saludos.
5 respuestas