2012-05-07 26 views
7

Jeśli mam następujące:Jak wywołać konstruktora jeśli funkcja ma taką samą nazwę

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

void T() 
{ 
} 

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

nie mam żadnego problemu z tym, ponieważ mogę być możliwe, aby ją zmienić, ale po prostu ciekawy, jak mogłem zmusić to wywołanie konstruktora, a także pytam się, dlaczego wywołanie funkcji ma wyższy priorytet niż konstruktor. Ponadto, dlaczego nie ma ostrzeżenia dotyczącego duplikatu nazwy.

+0

proste, nie nadawaj im tych samych nazw. Lub nie używaj parens z konstruktorem. –

+0

@MooingDuck: "nie rób" Chociaż jest to przyzwoita rada, nie odpowiada na pytanie. – SigTerm

Odpowiedz

3

Poza tym co jaunchopanza powiedział, można zakwalifikować połączenia:

T::T(); 

w tej wersji, można stworzyć uzupełnienia tymczasowe:

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

void foo(T) {} 

void T() 
{ 
} 

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

Nie jestem pewien, czy moja odpowiedź była prawidłowa. Ta funkcja wydaje się maskować domyślny konstruktor 'T', przynajmniej na mojej migawce gcc 4.8. – juanchopanza

+0

BTW to kompiluje dla Ciebie, a jeśli tak, z jakiego kompilatora? – juanchopanza

+0

@juanchopanza, kompiluje się w G ++ i clang ++ (4.4.3 i 1.1, resp). Dziwnie, więc robi 'foo (T :: T :: T :: T :: T :: T :: T());' –

0

Zasadniczo nie jest nazwą kolizji, Zasadniczo istnieją w różnych przestrzeniach nazw

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())  
Powiązane problemy