[C con Clase] Problemas con inicializacion de tipos

Ferran Ferri ferranferri en gmail.com
Dom Sep 20 17:31:11 CEST 2009


Hola, tengo una clase donde declaro std::map que contienen vector y colas, asi:

			/**
			* Clase que representa uno de los mensajes incluidos en la aplicacion.
			*
			*/
			class CStoredMessage{
			public:
				std::string message;
				LogLevel logLevel;
				std::string loggerGroup;
				time_t msgTime;
				CStoredMessage(std::string lgroup, LogLevel level, std::string
msg):loggerGroup(lgroup),logLevel(level),message(msg){
					msgTime = time(NULL);
				}
			};
			/************************************************************************/
			/* guardamos cada una de las colas de mensajes
                                               */
			/************************************************************************/
			typedef std::queue<CStoredMessage*> t_msgQueue;
			/************************************************************************/
			/* Guardamos la lista de listeners
                                   */
			/************************************************************************/
			typedef std::vector<IListener*> t_ListenerVector;
			/************************************************************************/
			/* Aqui guardamos las colas de mensajes catalogadas por loggerGroup
                                                                    */
			/************************************************************************/
			typedef std::map<std::string,t_msgQueue*> t_queueHolder;
			t_queueHolder queueHolder;
			/************************************************************************/
			/* Guardamos la lista de listeners agrupados por LoggerGroup
                                                             */
			/************************************************************************/
			typedef std::map<std::string,t_ListenerVector*> t_ListenerVectorMap;
			t_ListenerVectorMap listenerVectorMap;

Estas son las funciones que las usan
		void CGlobalLog::addLoggerGroup( std::string lGroup )
		{
			// comprobar si existe el grupo de loggers y crearlo en caso contrario.
			t_queueHolder::iterator it = queueHolder.find(lGroup);
			if (it == queueHolder.end())
			{
				queueHolder.insert(std::pair<std::string,t_msgQueue*>(lGroup,new
t_msgQueue()));
			}
			
		}

		void CGlobalLog::addListener( IListener* listener, std::string
loggerGroup /*= "[GLOBAL]"*/ )
		{
			t_ListenerVectorMap::iterator it = listenerVectorMap.find(loggerGroup);
			// Si el listener no esta asociado a ningun loggerGroup lo aņadimos aqui
			if (it == listenerVectorMap.end())
			{
				listenerVectorMap.insert(std::pair<std::string,t_ListenerVectorMap*>(loggerGroup,new
t_ListenerVector()));
			}

		}

Yo creo que las dos hacen casi lo mismo a diferencia de que
addlistener lleva un vector en vez de un queue. Pero la primera va
bien, y la he comprobado, pero la segunda no me compila. El
compilador, VStudio.NET 2008 me da un error como este:

1>Compilando...
1>GlobalLog.cpp
1>c:\users\ferran\directo\openglprojects\centrallog\centrallog\globallog.cpp(48)
: error C2665: 'std::pair<_Ty1,_Ty2>::pair' : ninguna de las 3
sobrecargas pudo convertir todos los tipos de argumento
1>        with
1>        [
1>            _Ty1=std::string,
1>            _Ty2=tools::GLog::CGlobalLog::t_ListenerVectorMap *
1>        ]
1>        c:\program files (x86)\microsoft visual studio
9.0\vc\include\utility(40): puede ser
'std::pair<_Ty1,_Ty2>::pair(const _Ty1 &,const _Ty2 &)'
1>        with
1>        [
1>            _Ty1=std::string,
1>            _Ty2=tools::GLog::CGlobalLog::t_ListenerVectorMap *
1>        ]
1>        al hacer coincidir la lista de argumentos '(std::string,
tools::GLog::CGlobalLog::t_ListenerVector *)'


La declaracion de IListener es asi (definida como una interface):
		class IListener
		{
			public:
				virtual void writeToLog(std::string loggerGroup, LogLevel level,
long time, std::string message )=0;
		};

Todo este codigo esta dentro del mismo namespace.
En que me estoy enquivocando???

Muchas gracias
Ferran




Más información sobre la lista de distribución Cconclase