Error de compilación en Dev C++ raro

Iniciado por Kasswed, 5 Mayo 2012, 14:37 PM

0 Miembros y 3 Visitantes están viendo este tema.

Kasswed

Buenas

no trabajo casi nada con Windows ni con Dev C++, así que no sé muy bien a qué es debido este error.

Yo tengo un proyecto con tres archivos:

main.cpp
Código (cpp) [Seleccionar]
#include <iostream>
#include "vectordinamico.h"

using namespace std;

int main(){
    vectorDinamico<int> aux(5);
}


vectordinamico.h
Código (cpp) [Seleccionar]
#ifndef __VECTORDINAMICO_H__
#define __VECTORDINAMICO_H__

#include <vector>
#include <list>

using namespace std;

template <typename T>
class vectorDinamico{
   private:
      list<vector<T> > datos;
      int tamBloque;
   public:
      vectorDinamico();
      ~vectorDinamico();
      vectorDinamico(int tam);
};

#endif


vectordinamico.cpp
Código (cpp) [Seleccionar]
#include "vectordinamico.h"


template <typename T>
vectorDinamico<T>::vectorDinamico(){
   tamBloque = 0;
}

template <typename T>
vectorDinamico<T>::~vectorDinamico(){
   tamBloque = 0;
}

template <typename T>
vectorDinamico<T>::vectorDinamico(int tam){
   tamBloque = tam;
   vector<T> aux(tamBloque);
   datos.push_back(aux);
}


Pero al compilar tengo este error:

[Linker error] undefined reference to `vectorDinamico<int>::vectorDinamico(int)'
[Linker error] undefined reference to `vectorDinamico<int>::~vectorDinamico()'


Seguro que es una tontería,

¿alguien sabe qué pasa?

Saludos!
"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

satu

Hola

En la facultad me han enseñado que con templates se escribe la implementación de los métodos en el .h y no hace falta el .cpp, pero no sé el motivo de esto. Pruébalo a ver si funciona

"vectordinamico.h"
Código (cpp) [Seleccionar]

#ifndef __VECTORDINAMICO_H__
#define __VECTORDINAMICO_H__

#include <vector>
#include <list>

using namespace std;

template <typename T>
class vectorDinamico{
   private:
      list<vector<T> > datos;
      int tamBloque;
   public:
      vectorDinamico();
      ~vectorDinamico();
      vectorDinamico(int tam);
};


template <typename T>
vectorDinamico<T>::vectorDinamico(){
   tamBloque = 0;
}

template <typename T>
vectorDinamico<T>::~vectorDinamico(){
   tamBloque = 0;
}

template <typename T>
vectorDinamico<T>::vectorDinamico(int tam){
   tamBloque = tam;
   vector<T> aux(tamBloque);
   datos.push_back(aux);
}

#endif


Saludos
Breakbeat como forma de vida

Kasswed

Hola gracias,

bueno lo he probado pero eso no soluciona el problema.

Yo apostaría a que todo está bien, quizá deba ser problema del compilador de Dev C++

¿Me recomendais algún otro software para Windows?
"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

STANHMAL

Cita de: Kasswed en  5 Mayo 2012, 18:16 PM
¿Me recomendais algún otro software para Windows?

Usa el Visual C++, es muy bueno, o si prefieres algo libre, puedes usar el NetBeans en conjunto con el gcc, hacen una combinación potente.

$4!u2
Power Metal vs Reggaeton



Que es mi ordenador mi tesoro que todo el mundo ha de temer. Mi ley, el ratón y el módem. Mi única patria, la red

n0z

Quizá sea porque no has configurado el directorio de includes(ficheros cabecera).
Tienes que ir a opciones de proyecto, y mira en la pestaña directorio de includes y pon el directorio donde tengas el .h

exel

Cita de: satu en  5 Mayo 2012, 17:25 PM

"vectordinamico.h"
Código (cpp) [Seleccionar]

#ifndef __VECTORDINAMICO_H__
#define __VECTORDINAMICO_H__

#include <vector>
#include <list>

using namespace std;

template <typename T>
class vectorDinamico{
   private:
      list<vector<T> > datos;
      int tamBloque;
   public:
      vectorDinamico();
      ~vectorDinamico();
      vectorDinamico(int tam);
};


template <typename T>
vectorDinamico<T>::vectorDinamico(){
   tamBloque = 0;
}

template <typename T>
vectorDinamico<T>::~vectorDinamico(){
   tamBloque = 0;
}

template <typename T>
vectorDinamico<T>::vectorDinamico(int tam){
   tamBloque = tam;
   vector<T> aux(tamBloque);
   datos.push_back(aux);
}

#endif


Esta solucion es correcta, ademas falta el pequeño detalle de no agregar el return 0 para main().

Kasswed el error es que los metodos que se encuentran en vectordinamico.cpp no existen para el compilador ya que no encuentra referencia hacia el mismo. Por eso, cuando intentas compilar main.cpp, en la especificacion de este hay una referencia a vectordinamico.h, pero ni en vectordinamico.h ni en main.cpp existe referencia a vectordinamico.h.

Perdon por la redundancia.

Saludos

Kasswed

Cita de: N0Z en  5 Mayo 2012, 21:04 PM
Quizá sea porque no has configurado el directorio de includes(ficheros cabecera).
Tienes que ir a opciones de proyecto, y mira en la pestaña directorio de includes y pon el directorio donde tengas el .h

Hola N0Z, lo he intentado configurar pero el error persiste.

exel como he dicho, lo he probado así y tampoco me soluciona el error. Yo creo que debe ser un error de Dev C++. Diría que g++ en Linux compila, la cosa es que ahora no puedo probar.

Dev C++ es raro, si me da estos errores así cada dos por tres, paso de trabajar con él.

Descargando Visual C++ a ver qué tal.

Netbeans no me gusta mucho.
"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

exel

 Precisamente, he descargado la ultima version del dev-c++ para probarlo y funciono.

Kasswed

Es cursioso jaja

le pongo un return 0; al main, y me compila.

Le pongo un comentario después del return 0; al main, y ya no me compila

Jaja este Dev C++ parace muy fiable.
"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

n0z

#9
Cita de: Kasswed en  6 Mayo 2012, 21:10 PM
Es cursioso jaja

le pongo un return 0; al main, y me compila.

Le pongo un comentario después del return 0; al main, y ya no me compila

Jaja este Dev C++ parace muy fiable.

Cuando le pones el comentario al main, le pones un comentario de una sola linea, ¿no? no vaya a ser que se te haya pasado y estes comentando el } que cierra.

Por curiosidad, ¿es que algún compilador deja que a una función que devuelve un entero, no le digas que tiene que retornalo?