2012-05-07 15 views
7

Nếu tôi có như sau:Làm thế nào để gọi constructor nếu hàm có cùng tên

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

void T() 
{ 
} 

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

tôi không có bất kỳ vấn đề với nó, vì tôi có thể có thể đổi tên nó, nhưng chỉ tò mò làm thế nào tôi có thể buộc nó gọi cho hàm tạo, và tôi cũng tự hỏi tại sao hàm gọi dường như có mức độ ưu tiên cao hơn so với hàm tạo. Ngoài ra, tại sao không có thông báo cảnh báo nào liên quan đến tên trùng lặp.

+0

đơn giản, không cho chúng cùng tên. Hoặc không sử dụng các parens với constructor. –

+0

@MooingDuck: "không" Trong khi đó là một lời khuyên tốt, nó không trả lời câu hỏi. – SigTerm

Trả lời

3

Bên cạnh những gì jaunchopanza nói, bạn có thể đủ điều kiện cuộc gọi: temporaries

T::T(); 

Với phiên bản này, bạn có thể tạo:

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

void foo(T) {} 

void T() 
{ 
} 

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

Tôi không chắc câu trả lời của mình là chính xác. Hàm này dường như che dấu hàm tạo mặc định 'T', ít nhất là trên ảnh chụp nhanh gcc 4.8 của tôi. – juanchopanza

+0

BTW nào biên dịch cho bạn, và nếu có, với trình biên dịch gì? – juanchopanza

+0

@juanchopanza, nó biên dịch trong G ++ và clang ++ (4.4.3 và 1.1, resp). Oddly, do đó, 'foo (T :: T :: T :: T :: T :: T :: T());' –

0

Về cơ bản, có được không nêu tên va chạm, về cơ bản, có trong các không gian tên khác nhau

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())  
Các vấn đề liên quan