• Jueves 14 de Noviembre de 2024, 17:00

Autor Tema:  Problemilla Con Un Iterador...  (Leído 1117 veces)

Mararía

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Problemilla Con Un Iterador...
« en: Martes 18 de Diciembre de 2007, 14:44 »
0
Bueno, este es mi problemilla... Yo tengo un set (de objetos Produccion). Produccion a su vez, tiene un vector de objetos semiProduccion... El problema me viene al intentar añadir una semiProduccion a una producción del set...

Es decir, yo tengo algo tal que:
Código: Text
  1. set <Produccion>::iterator it;
  2. For (it = miset.begin(); it != miset.end(); it++)
  3.    if (loquesea)
  4.       (*it).insertarsemi (algo) //suponiento 'algo' una semiproduccion que ya he definido
  5.  
  6.  

La declaracion (e implementacion) de InsertarSemi es:
 
Código: Text
  1. void InsertarSemi (SemiProduccion &S)const{PDerecha.push_back(S);}
  2.  

Pues, por mucho const que le ponga, le quite o me invente, siempre da error de compilacion... Si no tengo const (ni &) por ningun sitio me sale:

Citar
error: no se encuentra una función coincidente para la llamada a ‘Produccion::InsertarSemi(SemiProduccion&) const’
Produccion.h:14: nota: los candidatos son: void Produccion::InsertarSemi(SemiProduccion) <coincidencia cercana>

Y tal y como lo tengo ahora, que sigue la forma "‘Produccion::InsertarSemi(SemiProduccion&) const’"  que me pide el compilador, me sale que:

Citar
error: no se encuentra una función coincidente para la llamada a ‘std::vector<SemiProduccion, std::allocator<SemiProduccion> >::push_back(SemiProduccion&) const’
/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/bits/stl_vector.h:602: nota: los candidatos son: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = SemiProduccion, _Alloc = std::allocator<SemiProduccion>] <coincidencia cercana>


Solo que este error me lo da en el propio produccion.h y antes me lo daba al llamar a InsertarSemi (en Gramatica.C)..  &lt;_&lt;

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemilla Con Un Iterador...
« Respuesta #1 en: Martes 18 de Diciembre de 2007, 15:36 »
0
Reduci el codigo a la minima expresion, involucrando solo esas dos clases tuyas (mas la STL por supuesto).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Mararía

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Problemilla Con Un Iterador...
« Respuesta #2 en: Martes 18 de Diciembre de 2007, 19:01 »
0
No importa... ya lo arreglé (copiando el iterador, borrandolo, modificando la copia y metiéndola de nuevo en el set...)

Ahora tengo otro problemilla... No tiene nada que ver con los iteradores, pero como es el mismo proyecto, lo pongo aquí. Esta es mi clase Semiproduccion:

Código: Text
  1. #ifndef SemiProduccion_H
  2. #define SemiProduccion_H
  3. #include &#60;iostream&#62;
  4. #include &#60;vector&#62;
  5.  
  6.  
  7. using namespace std;
  8.  
  9. class SemiProduccion{
  10.  public:
  11.   SemiProduccion();
  12.   ~SemiProduccion();
  13.   bool operator &#60; (const SemiProduccion &S)const;
  14.   friend ostream &operator &#60;&#60; (ostream &os, const SemiProduccion &S);
  15.   bool EsUnitaria();
  16.   friend istream &operator &#62;&#62; (istream &is, SemiProduccion &S);
  17.  private:
  18.   char *Entrada;
  19.   char Siguiente;
  20. };
  21. #endif
  22.  

Pues bien, tengo problemas con el operador >> y es que, se pierde el valor de Entrada... Lo tengo implementado asi:

Código: Text
  1.  
  2. istream &operator &#62;&#62; (istream &is, SemiProduccion &S){ //is sera &#34;-&#62; xxxX&#34; o &#34;-&#62; Xxxx&#34;, y xxx será la         //entrada, sin saber a priori su longitud
  3.   do
  4.     is.ignore(1);
  5.   while (is.peek() != '&#62;');
  6.   is.ignore(1);
  7.   vector &#60;char&#62; aux;
  8.   if (islower (is.peek())){
  9.     do{
  10.       char ch;
  11.       is &#62;&#62; ch;
  12.       aux.push_back(ch);
  13.     }while (islower(is.peek()));
  14.     is &#62;&#62; S.Siguiente;
  15.   }
  16.   else{
  17.     is &#62;&#62; S.Siguiente;
  18.     if (isalpha(is.peek())){
  19.       do{
  20.   char ch;
  21.   is &#62;&#62; ch;
  22.   aux.push_back(ch);
  23.       }while (islower(is.peek()));
  24.     }
  25.     S.Entrada = &aux[0];
  26.   } //Hasta aquí, todo bien...
  27.   return is; //Pero en cuanto llego a esta linea, S.Entrada vuelve a valer &#34;&#34; (La pongo a null en el constructor)
  28. }
  29.  

He intentado de todo.. cambiar S por otro objeto con la entrada y el siguiente que leo, una funcion, SetEntrada a la que le paso un char*... etc. Pero el resultado es el mismo, al llegar al return, pierdo la entrada...  :(