[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