Compilador cree que el objeto que pusheo en vector es distinto tipo.

Iniciado por 16BITBoy, 27 Mayo 2012, 00:33 AM

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

16BITBoy

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 (cpp) [Seleccionar]

#ifndef _MYHEADER_HPP_
#define _MYHEADER_HPP_
class A{
public:
    std::string someString;
};

class B{
public:
    std::vector<A> aList;
public:
    void addA();
};

#endif /* _MYHEADER_HPP_ */

//implementation file

#include <string>
#include <vector>
#include "myheader.hpp"

void B::addA(){
    A a;
    a.someString = "Hola";
    // Here compiler says : Invalid arguments 'Candidates are: void push_back(const A &)' line 18 Semantic Error
    aList.push_back(a);
}



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 (cpp) [Seleccionar]
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.
Blog personal: http://www.16bitboy.com/blog

- Que horrible pesadilla, unos y ceros por todas partes... hasta me parecio ver un ¡dos!
- Bender, solo fue una pesadilla, no existe eso que llamas "dos".

RyogiShiki

Como hiciste con a debes instanciar tambien un objeto de clase B aList pertenece a la clase B:

Código (cpp) [Seleccionar]

A a;
B b;
a.someString = "Hola";
b.aList.push_back(a);


Saludos


16BITBoy

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.
Cita de: 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 (cpp) [Seleccionar]

A a;
B b;
a.someString = "Hola";
b.aList.push_back(a);


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.
Blog personal: http://www.16bitboy.com/blog

- Que horrible pesadilla, unos y ceros por todas partes... hasta me parecio ver un ¡dos!
- Bender, solo fue una pesadilla, no existe eso que llamas "dos".

RyogiShiki

Tienes toda la razón, mea culpa. No lei bien el código.

Saludos


Foxy Rider

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.