2012-04-05 9 views
5

Estoy tratando de implementar Mutex lock en una de mis funciones estáticas de clase de una tonelada. Pero obteniendo este error:Obteniendo 'm_Mutex' declarado como error de referencia pero no inicializado

$error:‘m_Mutex’ declared as reference but not initialized 
$warning:warning: unused variable ‘m_Mutex’ 

Aquí está mi fragmento de código.

======== Commondefines.h ==========

/** 
*@class LockBlock 
*This class is used to provide Mutex Lock on thread. 
*/ 
class LockBlock 
{ 
    public: 
     LockBlock(pthread_mutex_t *mutex) 
     { 
      lockMutex = mutex; 
      pthread_mutex_lock(lockMutex); 
     }; 


     ~LockBlock() 
     { 
      pthread_mutex_unlock(lockMutex); 
      lockMutex = NULL; 
     } 


    private: 
     pthread_mutex_t *lockMutex; 
}; 

======== MutexImplenation.h ======

#include "CommonDefines.h" 

class MutexImplementation 
{ 

    private: 
    static pthread_mutex_t m_Mutex ; 

    public: 
    static void commonFunction(); 

}; 

==== MutexImplementation.cpp ==========

// Initialize static member of class. 
pthread_mutex_t MutexImplentation::m_Mutex = PTHREAD_MUTEX_INITIALIZER; 


void commonFunction() 
{ 
    LockBlock(&m_Mutex); // Here I am getting this error. 


} 

Cualquier ayuda sería muy apreciada. Gracias, Yuvi

Respuesta

12

Esto es realmente una variante del problema "más vergonzoso". No se ha definido una m_Mutex en cualquier lugar excepto como miembro de MutexImplementation, por lo exterior de MutexImplementation, su nombre es MutexImplementation::m_Mutex (y ya que es privado, no se puede acceder a él legalmente). Cuando se escribe:

LockBlock (&m_Mutex); 

, el compilador no puede encontrar m_Mutex, y por lo tanto supone que son definir una variable local. Los paréntesis son legales, pero no tienen efecto , y la declaración es lo mismo que:

LockBlock& m_Mutex; 

Una referencia a LockBlock, y las referencias sólo se pueden definir si se inicializan.

Si quieres una variable local, tendrás que ponerle un nombre. Y si lo desea inicializado a m_Mutex, que tendrá que hacer m_Mutex pública, y especificar el nombre de la clase, así:

LockBlock& localRefToMutex(&MutexImplementation::m_Mutex); 

por ejemplo.

+0

cuando uso 'LockBlock & localRefToMutex (& MutexImplementation :: m_Mutex);' M obteniendo 'inicialización no válida de referencia no constante del tipo 'LockBlock &' de un temporal de tipo 'pthread_mutex_t *'' pero cuando uso 'LockBlock localRefToMutex (& MutexImplementation :: m_Mutex); 'se está compilando correctamente. – Yuvi

+0

No miré más allá de la sintaxis al hacer la corrección. La semántica también cuenta: ¿a qué se refiere 'localRefToMutex'? La expresión '& MutexImplementation :: m_Mutex' no tiene el tipo' LockBlock', e incluso si lo hizo, no es un lvalue, por lo que no puede usarse para inicializar una referencia a 'LockBlock'. –

Cuestiones relacionadas