[C con Clase] Problemas con inicializacion de tipos

Steven Davidson srd4121 en njit.edu
Dom Sep 20 18:09:21 CEST 2009


Hola Ferrán,

Ferran Ferri wrote:

[CORTE]

> 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 *)'
> 

Viendo los mensajes de error y el código que has escrito, el problema 
está aquí:

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()));
   }
}

La línea causante es:

listenerVectorMap.insert( std::pair<std::string,t_ListenerVectorMap*>( 
loggerGroup, new t_ListenerVector() ) );

La pareja es de una cadena 'std::string' y un puntero: 't_ListenerVector 
*'. Por lo tanto, esto debería ser,

listenerVectorMap.insert( std::pair<std::string,t_ListenerVector *>( 
loggerGroup, new t_ListenerVector ) );


También deberías eliminar los paréntesis al instanciar objetos sin 
parámetros con 'new'. Esto es,

new t_msgQueue

y no,

new t_msgQueue()

Al igual que,

new t_ListenerVector

en vez de,

new t_ListenerVector()


Espero que esto te ayude.

Steven





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