2016-11-02 8 views
10

मैं पुरातन विजुअल स्टूडियो 2008 का उपयोग कर रहा हूं (मुझे आपकी समस्या है "मुझे आपकी समस्या है"।) यह विजुअल स्टूडियो के साथ एक समस्या प्रतीत होता है: http://rextester.com/XKFR77690 यह एक समस्या है http://ideone.com/bhxMi0गतिशील_कास्ट जोर देने में त्रुटि

इन structs को देखते हुए: assert मैक्रो के साथ

struct base { virtual ~base() {} }; 

template <typename T> 
struct Foo : base { T foo; }; 

मैं यह कर सकता:

base* test = new Foo<pair<int, int>>; 

if(dynamic_cast<Foo<pair<int, int>>*>(test) != NULL) cout << "hello world\n"; 

लेकिन जब मैं एक assert में ठीक उसी कोड का उपयोग के रूप में if -statement में है: assert((Foo<pair<int, int>>*)(test) != NULL) लेकिन मुझे लगता है:

warning C4002: too many actual parameters for macro assert
error C2143: syntax error : missing ',' before ')'

संयोग से मैं एक सी शैली डाली का उपयोग करके इसे ठीक कर सकते हैं: assert(dynamic_cast<Foo<pair<int, int>>*>(test) != NULL) मैं कोई त्रुटि मिलती है कि सी-स्टाइल कास्ट static_castdynamic_cast नहीं करेगा जो मैं नहीं चाहता हूं।

उत्तर

8

assert एक मैक्रो है। यह प्रीप्रोसेसर द्वारा संभाला जाता है जो सी ++ संरचनाओं के बारे में कुछ भी नहीं जानता है। तो निम्नलिखित:

dynamic_cast<Foo<pair<int 

और

int>>*>(test) != NULL 

याद रखें कि समारोह की तरह मैक्रो तर्क:

assert(dynamic_cast<Foo<pair<int, int>>*>(test) != NULL) 

एक समारोह की तरह मैक्रो दो तर्क, जो इस मामले में कर रहे हैं लेने के लिए विस्तारित अल्पविराम से अलग हैं। वह सभी प्रीप्रोसेसर देखता है। तो इस मामले में यह assert द्वारा आवश्यक 1 तर्क के बजाय 2 तर्क देखता है।

आपका सी-स्टाइल कास्ट संस्करण संश्लेषण के कारण संयोग से काम करता है, जिसमें अल्पविराम की तुलना में अधिक प्राथमिकता होती है। उन्हें dynamic_cast के आस-पास रखना भी नौकरी करता है।

+0

पुन: "मेरे नीचे जवाब" - तो विभिन्न कारकों के आधार पर उत्तर पुन: व्यवस्थित करता है, इसलिए "नीचे" और "ऊपर" बदल सकता है। अभी, उदाहरण के लिए, मुझे आपके नीचे कोई जवाब नहीं दिख रहा है, लेकिन मुझे इसके ऊपर एक दिखाई देता है। –

+0

@PeteBecker मैंने सही शब्द खोजने के लिए 20 सेकंड बिताए और * नीचे * मेरा आखिरी उपाय था ... – DeiDei

+0

@DeiDei बस उत्तर को लिंक करें। –

8

यूप: मैक्रोज़ तर्क विभाजक के रूप में शीर्ष-स्तरीय अल्पविराम का इलाज करते हैं।

assert((dynamic_cast<Foo<pair<int, int>>*>(test)) != NULL) 

या, अगर आप चाहें, सम्पूर्ण सामग्री के आसपास लघुकोष्ठक::

assert((dynamic_cast<Foo<pair<int, int>>*>(test) != NULL)) 

कारण प्रश्न में सी-शैली डाली संकलित है सरल ठीक अपमानजनक कोड के आसपास कोष्ठक डाल करने के लिए है यह नहीं कि यह एक सी-स्टाइल कास्ट है, लेकिन यह टेम्पलेट कोड कोष्ठक में रखता है, इसलिए अल्पविराम अब बाहरी स्तर पर नहीं है।

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