2012-05-07 10 views
7

Se ho il seguente:Come chiamare il costruttore se la funzione ha lo stesso nome

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

void T() 
{ 
} 

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

Non ho alcun problema con esso, dal momento che potrei essere possibile rinominarlo, ma solo curioso come potevo forzare per chiamare il costruttore, e inoltre mi sto chiedendo perché la chiamata alla funzione sembra avere una priorità più alta del costruttore. Inoltre, perché non vi è alcun messaggio di avviso in merito al nome duplicato.

+0

semplice, non dare loro gli stessi nomi. O non usare i paren con il costruttore. –

+0

@MooingDuck: "non farlo" Sebbene sia un consiglio decente, non risponde alla domanda. – SigTerm

risposta

3

Oltre a quanto jaunchopanza detto, si può qualificare la chiamata:

T::T(); 

Con questa versione, è possibile creare provvisori:

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

void foo(T) {} 

void T() 
{ 
} 

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

Non sono sicuro che la mia risposta fosse corretta. La funzione sembra mascherare il costruttore predefinito di 'T', almeno sulla mia istantanea di gcc 4.8. – juanchopanza

+0

BTW viene compilato per te e, in caso affermativo, con quale compilatore? – juanchopanza

+0

@juanchopanza, si compila in G ++ e clang ++ (4.4.3 e 1.1, risp). Stranamente, anche 'foo (T :: T :: T :: T :: T :: T :: T());' –

0

In sostanza, non v'è il nome di collisione, in fondo, ci sono in diversi spazi dei nomi

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())  
Problemi correlati