2012-05-07 11 views
7

Si tengo el siguiente:Cómo llamar constructor si la función tiene el mismo nombre

class T 
{ 
    public: 
     T(){} 
}; 

void T() 
{ 
} 

int main() 
{ 
    T(); // this calls the function, how can I call the constructor T()? 
} 

que no tengo ningún problema con él, ya que podría ser posible para cambiar su nombre, pero sólo curiosidad cómo podría forzar llamar al constructor, y también me pregunto por qué la llamada a la función parece tener mayor prioridad que el constructor. Además, ¿por qué no hay un mensaje de advertencia con respecto al nombre duplicado?

+0

simple, no les dé los mismos nombres. O no use los parens con el constructor. –

+0

@MooingDuck: "do not" Si bien es un consejo decente, no responde la pregunta. – SigTerm

Respuesta

3

Además de lo jaunchopanza Dicho esto, se puede calificar la llamada:

T::T(); 

Con esta versión, se pueden crear los temporales:

class T 
{ 
    public: 
     T(){} 
}; 

void foo(T) {} 

void T() 
{ 
} 

int main(){ 
    foo(T::T()); 
} 
+0

No estoy seguro de que mi respuesta sea correcta. La función parece enmascarar el constructor predeterminado 'T', al menos en mi snapshot de gcc 4.8. – juanchopanza

+0

BTW lo compila para usted, y si es así, ¿con qué compilador? – juanchopanza

+0

@juanchopanza, compila en G ++ y clang ++ (4.4.3 y 1.1, resp). Curiosamente, también 'foo (T :: T :: T :: T :: T :: T :: T());' –

0

Básicamente, no hay conflicto de nombres, básicamente, hay en diferentes espacios de nombres

T() ==> namespace::T() It;s a function call not an object instantiation. 
T a() ==> namespace ::T::T() It;s is instantiation of T class calling the constructor. 
T a() ; a() ==>namespace ::T::T()::() It;s call the functor of the T Class (need to define the operator())  
Cuestiones relacionadas