Problema al compilar c++

Z

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
 
B

Primero, de todo, si no necesitas en un .h un include no es recomendable incluirlo (en este caso el iostream no se usa en ese .h).

El problema que estás teniendo es que la implementación del template la necesitas cuando lo usas, por lo que tiene que estar en el .h. Puedes no hacerlos inline y implementarlos abajo de la clase para que quede más limpio o, más usual, mover la implementación a un fichero .inl que puedes incluir o no con el template, como hacen los de Google. Lo que he visto en muchos sitios es implementar las funciones simples en el .h y solo usar el .inl para cosas complejas. Es bastante frecuente que en algunos sitios solo necesites copiar o asignar el template (para pasarlo como parametro) pero la funcionalidad "tocha" solo la usas a veces.

TL;DR Lo que implementas en el templ.cpp tiene que estar en el temp.h. Puedes poner las funciones en la definición o puedes ponerlo debajo de la clase (yo lo prefiero así).

dagavi

Con templates lo tienes que poner todo en el .h, todo el contenido de los .cpp (es decir, no separes la clase en el .h y .cpp, ponlo todo en el .h, obviamente el main si quieres si lo puedes dejar en su main.cpp o lo que te de la gana xD)

Usuarios habituales