2009-09-13 13 views
6

निम्नलिखित कोड पर विचार करें:,टेम्पलेट तर्क के रूप में कास्टिंग सूचक: Comeau और MSVC संकलन, जीसीसी में विफल रहता है

template<int* a> 
class base {}; 

int main() 
{ 
    base<(int*)0> test; 
    return 0; 
} 

दोनों Comeau और MSVC मुद्दों के बिना इस संकलन (Comeau एक अप्रयुक्त चर के बारे में चेतावनी को छोड़ कर), जबकि जीसीसी में विफल रहता है base<(int*)0> test; लाइन करते हुए कहा पर

In function `int main()': a casts to a type other than an integral or enumeration type cannot appear in a constant-expression

template argument 1 is invalid

वास्तव में यह क्या है के बारे में शिकायत की जाती है? और कौन सही है - क्या यह कोड संकलित होना चाहिए? यह ध्यान देने योग्य है कि मेरा जीसीसी संस्करण है अत्यधिक पुराना (3.4.2) ताकि उसके साथ कुछ करने के लिए हो। धन्यवाद।

+0

FYI करें: test.cpp:: 6: त्रुटि: एक प्रकार का अभिन्न या गणना प्रकार के अलावा अन्य करने के लिए एक डाली एक निरंतर अभिव्यक्ति में प्रकट नहीं कर सकते हैं test.cpp: 6: त्रुटि: टेम्पलेट जीसीसी 4.4.1 के साथ तर्क 1 अमान्य है test.cpp: 6: त्रुटि: ';' से पहले घोषणा में अमान्य प्रकार टोकन – jdehaan

+0

धन्यवाद jdehaan, तो हम जानते हैं कि मेरे संस्करण के साथ इसका कोई लेना-देना नहीं है। – GRB

+0

उर स्वागत है। मैंने इसे संकलित करने के लिए थोड़ा सा कोड संशोधित करने का प्रयास किया। थोड़ा बदलाव ने समस्या को स्पष्ट नहीं किया ... – jdehaan

उत्तर

8

एक draft standard से (जोर जोड़ा):

 
14.1.3 A non-type template-parameter shall have one of the following (option- 
    ally cv-qualified) types: 
    ... 
    --pointer to object, accepting an address constant expression desig- 
    nating a named object with external linkage, 
    ... 

जाहिर है, यह एक अशक्त सूचक के साथ एक टेम्पलेट का दृष्टांत के लिए कानूनी नहीं है, के रूप में एक नल पॉइंटर एक "बाहरी लिंकेज के साथ नामित वस्तु" को इंगित नहीं करता ।

+0

संबंधित SO: http://stackoverflow.com/questions/275871/how-to-overcome-gcc-restriction-could-not-convert-template-argument-0-to-foo – Managu

+1

+1! मैं त्रुटि पैरामीटर के रूप में एक पूर्णांक के लिए सूचक दे ​​रही है और का पालन करते हुए की कोशिश की आया त्रुटि (काफी गुप्त एक पहले से बेहतर): 'और एक' प्रकार का मान्य टेम्पलेट तर्क 'int *' क्योंकि 'एक' नहीं है बाहरी संबंध नहीं है – jdehaan

+1

यह आशाजनक प्रतीत होता है, लेकिन मुझे नहीं लगता कि यह जवाब क्यों है कि जीसीसी और कॉमौ अलग क्यों हैं। उदाहरण के लिए, यदि मैं 'बेस <(int*)1>' में बदल जाता हूं, * * * Comau और GCC दोनों संकलित करने में विफल रहते हैं। साथ ही, यदि इस आवश्यकता को 'प्रारूप' से है, ठीक है, मेरी जीसीसी यह संकलन करने में विफल रहता है फिर भी यह 4 वर्ष है, इसलिए यदि इस उस समय के दौरान मानक को जोड़ा गया है, तो यह है कि आवश्यकता है कि जीसीसी चोक बना रहा है नहीं होगा । – GRB

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