2011-04-14 17 views
7

की Typename लुकअप मुझे हाल ही में एक छात्र द्वारा एक संकलन मुद्दे के बारे में पूछा गया था। जवाब काफी सरल था लेकिन अभी मैं कारण के बारे में संघर्ष कर रहा हूं। एक साधारण उदाहरण:रिटर्न पैरामीटर

#include <iostream> 
#include <vector> 

struct MyStruct 
{ 
    typedef std::vector<int> MyIntVector; 

    MyIntVector CopyVector(MyIntVector const& vector); 
}; 


MyStruct::MyIntVector MyStruct::CopyVector(MyIntVector const& vector) 
^^^^^^^^ 
{ 
    MyIntVector vec; 
    return vec; 
} 

int main(int /*argc*/, char** /*argv*/) 
{ 
    MyStruct st; 
} 

C++ कोड वापसी पैरामीटर है पूरी तरह से योग्य होने के लिए वैध होने के लिए। उत्तर के लिए और संकलक/छात्र को खुश करने के लिए बहुत कुछ।

लेकिन वापसी मूल्य को कक्षा के साथ योग्यता और फ़ंक्शन के पैरामीटर के योग्य क्यों नहीं है?

मैंने हमेशा यह किया और मुझे पता है कि इसे एडीएल लुकअप के साथ करना है, लेकिन अब मुझसे पूछा गया कि मैं एक बेहतर उत्तर खोज रहा हूं।
क्या कोई मुझे उस भाषण या संकेत का संदर्भ दे सकता है जहां मुझे कुछ और जानकारी मिल सकती है?

उत्तर

7

व्याकरण की संरचना ऐसी है कि वापसी का प्रकार घोषित किए जाने वाले स्वतंत्रता से स्वतंत्र होता है और एक ही प्रकार के साथ कई चीजों को घोषित करना संभव है (लेकिन परिभाषित नहीं)।

int f(int), g(int); 

तो प्रकार के लिए देखने को प्रभावित करने की घोषणा की वस्तुओं की सटीक गुंजाइश होने के समस्याग्रस्त होगा: यह मान्य सी ++ है।

id1 ns1::f(int), ns2::g(int); 

आईडी 1 को देखा जाएगा?

कोई फ़ंक्शन परिभाषा में उपयोग करने के लिए विशेष नियम जोड़ सकता था (केवल एक कार्य परिभाषा हो सकती है - इसलिए कोई अस्पष्टता नहीं होगी - लेकिन कई ऑब्जेक्ट्स हो सकती हैं), लेकिन मुझे यकीन नहीं है कि संभावना की जांच की गई है, और मुझे लगता है कि जोड़ा गया जटिलता लाभ से मुआवजा नहीं दिया जाएगा।

+1

और कई समारोह * घोषणाओं * हो सकता है जैसे आप अपने उदाहरण में दिखा। मित्र घोषणाओं के लिए, यह वास्तव में मान्य भी है, अर्थात्, मुझे लगता है: 'संरचना सी {दोस्त शून्य ए :: एफ(), बी :: एफ(); }; '। –

3

पार्सिंग के साथ आगे बढ़ने के लिए, कंपाइलर को यह पता लगाने की आवश्यकता है कि टाइपनाम और क्या नहीं है।

नामस्थान स्कोप पर होने वाली एकमात्र चीज एक घोषणा है, और अधिकांश सी ++ घोषणाएं टाइपनाम के साथ शुरू होती हैं, लेकिन सी में यह मामला नहीं है। एक सी प्रोग्राम में अपरिवर्तनीय पहचान पर एक भटकना, अपरिभाषित पहचानकर्ता इसे घोषित करता है static दृश्यता के साथ int होने के लिए।

किसी प्रोग्राम को संकलित करने की संभावना के बावजूद, यह पार्सर को बहुत आसान बनाता है अगर यह कक्षा के संदर्भ में बाद में पहचान के लिए टोकन को कतारबद्ध किए बिना शुरुआत से अंत तक आगे बढ़ सकता है।

सी ++ 11 अनुगामी-रिटर्न प्रकार वाक्य रचना के साथ समस्या का हल:

auto MyStruct::CopyVector(MyIntVector const& vector) -> MyIntVector { 
+0

लेकिन ध्यान दें कि कुछ घोषणाएं किसी प्रकार के नाम से शुरू नहीं होती हैं। विशेष रूप से, 'सी :: ऑपरेटर int() {} '(रूपांतरण फ़ंक्शन),' सी :: सी() {} '(कन्स्ट्रक्टर) और' सी :: ~ सी() {} '(विनाशक) नहीं है एक प्रकार के नाम से शुरू करें। वे सभी एक घोषणाकर्ता-आईडी नामकरण कार्यों के साथ शुरू करते हैं। –

+0

@ जोहान्स: मैंने उस तर्क में अधिक जमीन को कवर करने के बारे में सोचा था, क्योंकि 'नेमस्पेस' और स्टोरेज क्लास विनिर्देशक जैसे स्पष्ट अपवाद हैं। यह निश्चित रूप से गलत हो गया। यह सिर्फ एक स्ट्रॉमैन तर्क है, वैसे भी ... – Potatoswatter

संबंधित मुद्दे