2012-12-18 13 views
6

मैंने सी ++ में पहले कभी नहीं खेला है, लेकिन यह अजीब है कि यह अभी भी संकलित है लेकिन मुझे उम्मीद नहीं है। क्या कोई मुझे बता सकता है कि यह क्या करता है? कृपया कोड देखें, अधिक जानकारी निम्नानुसार है।सी ++ में कक्षा को इंस्टेंट करना: अजीब सिंटेक्स बग

#include <iostream> 
using namespace std; 

class Test{ 
    public: 
     Test(); 
}; 

Test::Test(){ cout << "ctor" << endl; } 

int main(void){ 

    Test t(); // this compiles but doesn't call the constructor 

    return(0); 
} 

यह संकलित होगा, लेकिन अगर मैं "टी" का उपयोग करने की कोशिश करता हूं तो यह नहीं होगा। मैं केवल कन्स्ट्रक्टर कार्यक्षमता पर निर्भर था, और मेरा कोड अपेक्षित काम नहीं करता था। समाधान कोष्ठक खोना है "टेस्ट टी();" "टेस्ट टी;" के लिए। मेरा सवाल यह है कि "टेस्ट टी();" में क्या चल रहा है उदाहरण, और संकलक सोचने वाला क्या हो रहा है कि यह इसे संकलित करने देता है।

+5

सबसे अप्रिय पार्स को फिर से देखें:

सबसे आसान तरीका है ठीक कि पार्स कोष्टक से छुटकारा पाने के और केवल इस तरह के रूप में अपने चर घोषित है। – chris

+1

आपके अनुष्ठान के अनुष्ठान में आपका स्वागत है। –

+0

सवाल यह है कि ... क्या संकलक जानता था कि आप क्या उम्मीद कर रहे थे? :) – Carl

उत्तर

5

यह Most Vexing Parse है। मूल रूप से, सी ++ पार्सिंग नियमों के मुताबिक, आपके पास Test नाम t नामक वस्तु का कोई ऑब्जेक्ट नहीं है, बल्कि फ़ंक्शन t फ़ंक्शन के लिए फ़ंक्शन घोषणा है जो शून्य तर्क लेता है और Test देता है।

संयोग से, क्लैंग ++ वास्तव में इस स्थिति को पहचानता है और आपको चेतावनी देता है कि आपको यह संभवतः वह नहीं कर रहा है जो आप चाहते हैं।

+0

क्या हम अन्य कार्यों में कार्यों को घोषित/परिभाषित कर सकते हैं? मुझे नहीं लगता? –

+0

@ कार्तिकट: मुझे नहीं लगता कि आप सी ++ में नेस्टेड फ़ंक्शंस को परिभाषित कर सकते हैं, लेकिन आप निश्चित रूप से उन्हें घोषित कर सकते हैं। उदाहरण के लिए, यह ठीक काम करता है: 'int main() {void foo(); foo(); } शून्य foo() {std :: cout << "foo" << std :: endl; } ' –

+0

@ कार्तिक: कार्यों को अन्य कार्यों के अंदर * घोषित किया जा सकता है। सी – AnT

1

यह एक आम समस्या है जिसे उपयुक्त रूप से के रूप में नामित किया गया है जो सबसे अधिक परेशानी पार्स है। आपकी लाइन Test t(); दो तरीकों से व्याख्या की जा सकती है।

  1. यह एक चर t प्रकार का है जो घोषणा कर सकते हैं Test
  2. यह एक समारोह t() है, जो एक Test मान देता है और कोई तर्क

सी ++ मानक दुर्भाग्य से करने के लिए संकलक की आवश्यकता है लेता घोषणा कर सकते हैं दूसरे विकल्प पर विचार करें, जो काफी परेशान पार्स है।

Test t; // Will call the default constructor 
संबंधित मुद्दे