Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 16BITBoy en 27 Mayo 2012, 00:33 am



Título: Compilador cree que el objeto que pusheo en vector es distinto tipo.
Publicado por: 16BITBoy en 27 Mayo 2012, 00:33 am
Es un error bastante extraño, verán tengo 2 clases, una de ellas con un string como miembro y la otra tiene un vector de objetos de la otra clase y un metodo que solo crea y añade un objeto a ese vector.

Cuando tenía interfaz e implementación juntos en el mismo fichero, el compilador aceptaba el objeto sin problemas, pero después de separarlos ya no lo reconoce, aun pudiendo acceder sin problemas a la declaración de la clase del objeto.

Código
  1. #ifndef _MYHEADER_HPP_
  2. #define _MYHEADER_HPP_
  3. class A{
  4. public:
  5.    std::string someString;
  6. };
  7.  
  8. class B{
  9. public:
  10.    std::vector<A> aList;
  11. public:
  12.    void addA();
  13. };
  14.  
  15. #endif /* _MYHEADER_HPP_ */
  16.  
  17. //implementation file
  18.  
  19. #include <string>
  20. #include <vector>
  21. #include "myheader.hpp"
  22.  
  23. void B::addA(){
  24.    A a;
  25.    a.someString = "Hola";
  26.    // Here compiler says : Invalid arguments 'Candidates are: void push_back(const A &)' line 18 Semantic Error
  27.    aList.push_back(a);
  28. }
  29.  
  30.  

He intentado declarando un puntero a vector de A en vez de hacerlo de esta forma y resulta igual. También, si en B::addA() haces:
Código
  1. std::cout << a.someString << std::endl;
Accede sin problemas al objeto, con lo cual creo que puede acceder perfectamente a la declaración de la clase en ese momento.

¿Que estoy haciendo mal?

Gracias de antemano.


Título: Re: Compilador cree que el objeto que pusheo en vector es distinto tipo.
Publicado por: RyogiShiki en 27 Mayo 2012, 01:56 am
Como hiciste con a debes instanciar tambien un objeto de clase B aList pertenece a la clase B:

Código
  1. A a;
  2. B b;
  3. a.someString = "Hola";
  4. b.aList.push_back(a);
  5.  

Saludos


Título: Re: Compilador cree que el objeto que pusheo en vector es distinto tipo.
Publicado por: 16BITBoy en 27 Mayo 2012, 19:03 pm
Después de mas de 3 horas depurando el código y buscando la raíz del problema, he llegado finalmente a ella. Eclipse CDT guarda una caché del código al hacer la precomprobación sintáctica y semántica antes de pasarle el código al compilador. Pues bien esta caché estaba corrupta, una vez eliminada, todo volvió a funcionar con normalidad.
Como hiciste con a debes instanciar tambien un objeto de clase B aList pertenece a la clase B:

Código
  1. A a;
  2. B b;
  3. a.someString = "Hola";
  4. b.aList.push_back(a);
  5.  

Saludos
Esto que mencionas RyogiShiki seria solo cierto si ese código que has leido estuviera fuera de la clase B. Puesto que es un código de implementación de la clase B no tiene sentido eso que dices.
Gracias de todos modos, un saludo.


Título: Re: Compilador cree que el objeto que pusheo en vector es distinto tipo.
Publicado por: RyogiShiki en 27 Mayo 2012, 19:34 pm
Tienes toda la razón, mea culpa. No lei bien el código.

Saludos


Título: Re: Compilador cree que el objeto que pusheo en vector es distinto tipo.
Publicado por: Foxy Rider en 27 Mayo 2012, 21:37 pm
Por cierto, tanto el include de vector e string, corresponden al encabezado de la clase A, por que es una dependencia de A, que se requiere en ese encabezado. también tenés dos "publics" cuando uno es suficiente para todo lo que está abajo.
La regla general que uso es que si en una declaración se requiere el tipo de dato de un header X, se incluye junto a la declaración ... si sólo la implementación, entonces al .cpp

Pensá que la declaración de una clase en un .h, y su definición en un .cpp, son dos partes de una unidad básica de compilación, por ponértelo en esos términos ...

Saludos.