2010-06-04 6 views
5

आज मेरे दोस्तों में से एक ने मुझे बताया कि निम्नलिखित कोड अपने विजुअल स्टूडियो 2008 पर अच्छी तरह से संकलित:विज़ुअल सी ++ कंपाइलर आश्रित-नाम को "टाइपनाम" के बिना एक प्रकार के रूप में अनुमति देता है?

#include <vector> 
struct A 
{ 
    static int const const_iterator = 100; 
}; 
int i; 
template <typename T> 
void PrintAll(const T & obj) 
{ 
    T::const_iterator *i; 
} 
int main() 
{ 
    std::vector<int> v; 
    A a; 
    PrintAll(a); 
    PrintAll(v); 
    return 0; 
} 

मैं आमतौर पर जी ++ का उपयोग करें, और यह हमेशा दूसरे PrintAll() कॉल पारित करने के लिए इंकार कर दिया। जैसा कि मुझे पता है, इस समस्या के लिए, g ++ टेम्पलेट का अनुवाद करने का मानक तरीका कर रहा है।

तो, क्या मेरा ज्ञान गलत है, या यह वीएस -2008 का विस्तार है?

+0

क्या यह/ज़ा (सख्त) या/ज़ी (डिफ़ॉल्ट, एक्सटेंशन) है? – MSalters

+0

@MSalters: मैंने अभी/ज़ा के साथ प्रयास किया। कोई फर्क नहीं पड़ता ... – hpsMouse

उत्तर

8

यह कोई विस्तार नहीं है।

कुलपति ++ ठीक से दो चरणों व्याख्या कभी नहीं लागू किया:

  1. परिभाषा के बिंदु पर, टेम्पलेट को पार्स और सभी गैर निर्भर नाम
  2. निर्धारित इन्स्टेन्शियशन के बिंदु पर, जाँच करें कि टेम्पलेट मान्य पैदा करता है कोड

कुलपति ++ पहले चरण कभी नहीं लागू किया ... यह असुविधाजनक है, यह न केवल यह है कि यह कोड है कि गैर-संगत लेकिन यह भी है कि यह कुछ स्थितियों में एक पूरी तरह अलग कोड का उत्पादन होता है स्वीकार करता है इसका मतलब है के बाद से। क्योंकि यह केवल परिभाषा टेम्पलेट की परिभाषा और foo के संकल्प के बिंदु पर उपलब्ध T पर निर्भर नहीं करता था

  • अनुरूप compilers, "पूर्णांक" प्रिंट होगा:

    void foo(int) { std::cout << "int" << std::endl; } 
    
    template <class T> void tfoo() { foo(2.0); } 
    
    void foo(double) { std::cout << "double" << std::endl; } 
    
    int main(int argc, char* argv[]) 
    { 
        tfoo<Dummy>(); 
    } 
    
    इस कोड के साथ

  • कुलपति ++, "डबल" प्रिंट होगा क्योंकि यह कभी चरण 1

यह बेवकूफ जहाँ तक मतभेद जाना के रूप में लग सकता है से परेशान है, लेकिन भी शामिल है की अगर आप संख्या के बारे में लगता है कि आप एक बड़े कार्यक्रम में होता है, इसलिए एक जोखिम है कि कोई आपके टेम्पलेट कोड के बाद अधिभार पेश करेगा ... और बीएएम:/

+0

कम से कम एक चेतावनी उत्पन्न करने के लिए 'वीसी ++' प्राप्त करने का कोई तरीका? यह व्यवहार कोड के लिए एक उपद्रव है जो कई कंपाइलरों में काम करना चाहिए। हमारी टीम के डेवलपर हर समय कीवर्ड जोड़ना भूल जाते हैं और कोड 'क्लैंग' – Samaursa

+1

@ सैमौर्स पर संकलित करने में विफल रहता है: दुर्भाग्यवश, मुझे नहीं पता कि। यदि आप क्लैंग का उपयोग कर रहे हैं, तो आप यह जानकर दिलचस्प हो सकते हैं कि वे वीसी ++ के लिए ड्रॉप-इन ड्राइवर विकसित कर रहे हैं ताकि आप सीधे विजुअल स्टूडियो से क्लैंग का आह्वान कर सकें। –

1

मुझे यकीन नहीं है कि "विस्तार" बिल्कुल इस संबंध में मैं वीसी ++ का वर्णन कैसे करूंगा, लेकिन हां, इस संबंध में जीसीसी के पास बेहतर अनुरूपता है।

+0

क्या यह विजुअल स्टूडियो का अनुमोदित मोड में व्यवहार नहीं है? मुझे लगता है कि यह कोड को सख्त मोड में अस्वीकार कर देगा, और वीसी 6 के साथ पिछड़ा संगतता के लिए इस एक्सटेंशन को लागू करेगा। – MSalters

+0

@MSalter: नहीं, वीसी ++ कोड को/Za के साथ भी स्वीकार करता है। –

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

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