Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:

Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro


error c2678

Aqui programadores en la plataforma Win32 con Visual C++ de Microsoft...

Moderador: latindeveloper

error c2678

Notapor antelles el Jue Nov 01, 2007 2:22 am

Hola a todos:
me he encontrado con el siguiente error y no sé, por más que busco, dónde está el fallo
M:\MaxHotel\LibroReservas.cpp(151) : error C2678: binary '>>' : no operator defined which takes a left-hand operand of type 'class istream_withassign' (or there is no acceptable conversion)

Adjunto el código para aclararlo más. Gracias por la ayuda.

Código: Seleccionar todo
// LibroReservas.cpp: implementation of the CLibroReservas class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MaxHotel.h"
#include "LibroReservas.h"
#include "Habitacion.h"
#include "Reserva.h"
#include <iostream.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CLibroReservas::CLibroReservas()
{

}

CLibroReservas::~CLibroReservas()
{
   CHabitacion* ptrHabitacion;
   int nKey;
   POSITION pos;
   //destruimos los objetos CHabitacion
   pos=m_mapHabitaciones.GetStartPosition();
   while(pos)
   {
      m_mapHabitaciones.GetNextAssoc(pos,nKey,ptrHabitacion);
      m_mapHabitaciones.RemoveKey(nKey);
      delete ptrHabitacion;
   }



}
//añade una nueva habitación al hotel

void CLibroReservas::NuevaHabitacion()
{
int nNumero, nCamas;
bool bAseo,bTelevisor,bClimatizacion;
CHabitacion* ptrHabitacion;
//solicitamos los datos de la nueva habitación
SolicitarDatosHabitacion(nNumero,nCamas,bAseo,bTelevisor,bClimatizacion);
//creamos el objeto Habitacion
ptrHabitacion=new CHabitacion(nNumero, nCamas,bAseo,bTelevisor,bClimatizacion);
if(ptrHabitacion==NULL)
throw"No queda memoria disponible";
else
{
   //añadimos la habitación al map de habitaciones
   m_mapHabitaciones.SetAt(ptrHabitacion->NumeroHabitacion(),ptrHabitacion);
}
}
//realiza si es posible una nueva reserva
void CLibroReservas::RealizarReserva()
{
   int nCamas,nNumeroHabitacion;
   bool bAseo,bTelevisor,bClimatizacion;
   char cTemp;
   CString szCliente;
   COleDateTime dtLlegada, dtSalida;
   CHabitacion* ptrHabitacion;
   CArray<CHabitacion*,CHabitacion*&>aHabitaciones;
   //solicitamos las características de la habitacion
   SolicitarDatosReserva(nCamas,bAseo,bTelevisor,bClimatizacion,dtLlegada,dtSalida,szCliente);
      //obtenemos el array de habitaciones libres que cumplen estas características
      ObtenerHabitacionesLibres(nCamas,bAseo,bTelevisor,bClimatizacion,dtLlegada,dtSalida,aHabitaciones);
   //si no hay ninguna habitación libre avisamos al usuario
   if(aHabitaciones.GetSize()==0)
   {
      cout<<"No hay ninguna habitacion libre para la fecha indicada.\n";
      cin>>cTemp;
   }
   else
   {
      cout<<"Estas son las habitaciones disponibles\n\n";
      //listamos las habitaciones libres
      ListarNumeroHabitaciones(aHabitaciones);
      //solicitamos el número de la habitación deseada
      cout<<"\nSeleccione una habitacion de la lista: ";
      cin>>nNumeroHabitacion;
      if(m_mapHabitaciones.Lookup(nNumeroHabitacion,ptrHabitacion))
      {
         ptrHabitacion->NuevaReserva(szCliente,dtLlegada,dtSalida);
         cout<<"\nLa reserva se ha realizado satisfactoriamente.\n";
      }
      else
         cout<<"\nHa introducido un numero de habitacion incorrecto\n";
      cout<<"\nPulse 'c' y return para continuar\n";
      cin>>cTemp;
   }
}
void CLibroReservas::ListarReservas()
{
   CHabitacion* ptrHabitacion;
   int nKey;
   POSITION pos;
   char cTemp;
   pos=m_mapHabitaciones.GetStartPosition();
   while(pos)
   {
      m_mapHabitaciones.GetNextAssoc(pos,nKey,ptrHabitacion);
      ptrHabitacion->ListarReservas();
      cout<<"\n\n";
   }
   cout<<"\nPulse 'c' y return para continuar\n";
   cin>>cTemp;
}


void CLibroReservas::ListarHabitaciones()
{

   CHabitacion* ptrHabitacion;
   int nKey;
   POSITION pos;
   char cTemp;
   pos=m_mapHabitaciones.GetStartPosition();
   while(pos)
   {
      m_mapHabitaciones.GetNextAssoc(pos,nKey,ptrHabitacion);
      cout<<*ptrHabitacion;
      cout<<"\n";
   }
   cout<<"\nPulse 'c' y return para continuar\n";
   cin>>cTemp;
}


/****************PRIMER NIVEL DE DESCOMPOSICION*****************/

//solicita los datos de la habitación

void CLibroReservas::SolicitarDatosHabitacion(int& nNumero,int& nCamas,bool& bAseo,bool &bTelevisor,
                                   bool &bClimatizacion)
{
   cout<<"Numero de habitacion: ";
   cin>>nNumero;
   cout<<"\nNumero de camas: ";
   cin>>nCamas;
   cout<<"\nAseo (1=SI, 0=NO):";
   cin>>bAseo;
   cout<<"\nTelevisor (1=SI, 0=NO):";
   cin>>bTelevisor;
   cout<<"\nClimatizacion (1=SI, 0=NO):";
   cin>>bClimatizacion;
}

   //solictia los datos de la reserva

   void CLibroReservas::SolicitarDatosReserva(int& nCamas,bool &bAseo,bool &bTelevisor,bool &bClimatizacion,
      COleDateTime &dtLlegada,COleDateTime &dtSalida,CString szNombre)
   {
      //cademas de catacteres temporales para capturar las fechas
      CString szLlegada, szSalida;
      cout<<"Numero de camas:";
      cin>>nCamas;
      cout<<"\nAseo (1=SI, 0=NO):";
      cin>>bAseo;
      cout<<"\nTelevisor(1=SI, 0=NO):";
      cin>>bTelevisor;
      cout<<"\nClimatizacion(1=SI, 0=NO):";
      cin>>bClimatizacion;
      //solicitamos la fecha de llegada
      cout<<"\nFecha de llegada(dd/mm/aa):";
      cin>>szLlegada.GetBuffer(30);
      szLlegada.ReleaseBuffer(-1);
      //solicitamos el nombre del cliente
      cout<<"\nNombre del cliente:";
      cin>>szNombre.GetBuffer(100);
      szNombre.ReleaseBuffer(-1);
      //convertimos las cadenas de caracteres con las fechas
      //a objetos COleDateTime
      dtLlegada.ParseDateTime(szLlegada);
      dtSalida.ParseDateTime(szSalida);
   }
   //coloca en el array los punteros a todas las habitaciones libres en
   //las fechas indicadas que cumplen con los requisitos
   void CLibroReservas::ObtenerHabitacionesLibres(int nCamas,bool bAseo,bool bTelevisor,bool bClimatizacion,COleDateTime dtLlegada,
      COleDateTime dtSalida,CArray<CHabitacion*,CHabitacion*&>&aHabitaciones)
   {
      CHabitacion* ptrHabitacion;
      int nKey;
      POSITION pos;
      //recoore el map hata que se acaban las habitaciones y añadimos
      //al array todas las que cumplen los requisitos y
      //están libres entre dtLlegada y dtSalida
      pos=m_mapHabitaciones.GetStartPosition();
      while(pos)
      {
         m_mapHabitaciones.GetNextAssoc(pos,nKey,ptrHabitacion);
         if(ptrHabitacion->CoincidenCaracteristicas(nCamas,bAseo,bTelevisor,bClimatizacion)&&ptrHabitacion->Libre(dtLlegada,dtSalida))
         {
            aHabitaciones.Add(ptrHabitacion);
         }
      }
   }
   //lista las habitaciones del array
   void CLibroReservas::ListarNumeroHabitaciones(CArray<CHabitacion*,CHabitacion*&>& aHabitaciones)
   {
      CHabitacion* ptrHabitacion;
      for(int nIndice=0;nIndice<=aHabitaciones.GetUpperBound();nIndice++)
      {
         ptrHabitacion=aHabitaciones.GetAt(nIndice);
         cout<<ptrHabitacion->NumeroHabitacion()<<"\n";
      }
   }
antelles
Novato
Novato
 
Mensajes: 6
Registrado: Lun Sep 17, 2007 5:45 pm

Re: error c2678

Notapor ivancp el Vie Nov 02, 2007 9:46 am

La linea 151 (creo que) corresponde a una de estas lineas.

Código: Seleccionar todo
   cin>>bAseo;
   cout<<"\nTelevisor (1=SI, 0=NO):";
   cin>>bTelevisor;
   cout<<"\nClimatizacion (1=SI, 0=NO):";
   cin>>bClimatizacion;


Lo que pasa es que los objetos cin y cout no acepta el tipo de dato bool. Te sugiero que utilices la macro BOOL que en realidad es un int.

Código: Seleccionar todo
   BOOL bAseo,bTelevisor,bClimatizacion;
   cin>>bAseo;
   cout<<"\nTelevisor (1=SI, 0=NO):";
   cin>>bTelevisor;
   cout<<"\nClimatizacion (1=SI, 0=NO):";
   cin>>bClimatizacion;


El comportamiento es el mismo, y esta definido TRUE como equivalente a true y FALSE como equivalente a false.
ivancp
Programador Experimentado
Programador Experimentado
 
Mensajes: 308
Registrado: Jue Sep 06, 2007 12:57 pm

error c2678

Notapor antelles el Vie Nov 02, 2007 11:32 am

Ya he probado lo que me indicas y funciona perfectamente.
Muchas gracias por tu ayuda.
antelles
Novato
Novato
 
Mensajes: 6
Registrado: Lun Sep 17, 2007 5:45 pm


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados