2015-11-02 6 views
12

मेरे पास कोड का निम्न भाग है जो विजुअल सी ++ 2015 के तहत संकलित नहीं होता है, लेकिन जीसीसी 4.8.4 के तहत करता है। मुझे आश्चर्य है कि कौन सा सही है? सवाल में कोड यहाँ नीचे है:टेम्पलेट पैरामीटर के रूप में विनिर्देशक ओवरराइड - क्या यह मान्य है?

template <class T> class ATemplate; 
template <class R, class A1> 
    struct ATemplate<R(A1)>{ }; 

int main() 
{ 
    ATemplate<void(int)> x; 
// ATemplate<void(int)override> y; //---Does not compile!!! 
    return 0; 
} 

यह गलत यहाँ नीचे (या स्थिरांक) विनिर्देशक के रूप में ओवरराइड उपयोग करने के लिए है। जीमेल लाइब्रेरी में इसी तरह का कोड मौजूद है, जहां मैक्रो विस्तार का उपयोग टेम्पलेट पैरामीटर (ओवरराइड समेत), साथ ही साथ वास्तविक फ़ंक्शन हस्ताक्षर उत्पन्न करने के लिए किया जाता है। जब बाहर टिप्पणी की लाइन को हटाने

विजुअल C++ 2015 निम्न त्रुटि पैदा करता है:

x.cpp(11): error C2062: type 'int' unexpected 
x.cpp(11): error C2976: 'ATemplate': too few template arguments 
x.cpp(4): note: see declaration of 'ATemplate' 
x.cpp(11): error C2079: 'y' uses undefined class 'ATemplate' 

उल्लेख ओवरराइड कि मुक्त कार्य (वैध बिंदु) के संदर्भ में कोई मतलब नहीं है नीचे जवाब में से एक - यह करता है मतलब जीसीसी यहाँ गलत है। कॉन्स विनिर्देश उस मामले में भी बेकार है (मुफ्त कार्यों के लिए), लेकिन फिर भी अनुमति (वीसी ++ द्वारा) ??? साथ ही, यह उल्लेख करता है कि आभासी विनिर्देश केवल घोषणा में ही मौजूद होना चाहिए - इससे इस मामले में कोई फर्क नहीं पड़ता है (क्योंकि कोई परिभाषा मौजूद नहीं है)। वर्चुअल कीवर्ड के लिए, व्युत्पन्न में छोड़ना ठीक है क्योंकि यह कोड संकलित करता है या नहीं, लेकिन ओवरराइड केस के लिए यह ठीक नहीं है क्योंकि यह एक बड़ा अंतर बनाता है।

ReturnType (ArgType आर्ग) ... संभव स्थिरांक या (जैसे GMock करता है) एक मैक्रो पैरामीटर के रूप में विनिर्देशक ओवरराइड का उपयोग करते समय प्रतिबंध VCC द्वारा लगाए गए इस कोड (भी जाहिरा तौर पर बजना के लिए मामला) को संकलित करने का कारण बनता है न । कौन सा सही है?

मानक यह नहीं बताता है कि इस संदर्भ में ओवरराइड विनिर्देशक का उपयोग नहीं किया जाएगा (टेम्पलेट पैरामीटर का संदर्भ?), है ना?

+0

वोट मैं शायद कुछ स्पष्ट याद कर रहा हूँ से परखने के बाद, लेकिन जहां समारोह आप ओवरराइड करना चाहते है? –

+0

@ करोलो हॉर्वथ जो अप्रासंगिक है –

+0

@ करोलो हॉर्वथ, हां, यह अप्रासंगिक है। पोस्ट किया गया कोड न्यूनतम है और त्रुटि उत्पन्न करता है। –

उत्तर

8

यह एक g ++ बग है।

मानक दो प्रस्तुतियों में virt-विनिर्देशक-सेकंड परमिट: एक समारोह परिभाषा (केवल virtualसदस्य समारोह परिभाषाओं) में और एक सदस्य-declarator में। आपका संदर्भ न तो है।

जीसीसी के बग्गी व्यवहार का एक छोटा डेमो:

void foo(void) override;   // g++ rejects with message: 
            // virt-specifiers in 'foo' 
            // not allowed outside a class definition 
void (*bar)(void) override;  // g++ erroneously accepts 
typedef void baz(void) override; // g++ erroneously accepts 
5

मानक के अनुसार override विनिर्देशक संदर्भ के प्रति संवेदनशील है और विशेष अर्थ है केवल जब यह एक सदस्य समारोह घोषणा के बाद प्रयोग किया जाता है; अन्यथा, यह एक आरक्षित कीवर्ड नहीं है।

तो मैं कहूंगा कि आपके दूसरे उदाहरण में कोड अर्थहीन लगता है।

मैं (एस ध्वज के साथ) gcc-5.1.0 के साथ अपने दोनों उदाहरण के संकलन की कोशिश की और वे ठीक उसी विधानसभा में परिणाम।

यह clang-3.7.0 के तहत संकलित नहीं है निम्नलिखित त्रुटि में परिणाम:

test.cpp:11:23: error: expected '(' for function-style cast or type construction 

Pracitcally यह मतलब है कि आप है कि रास्ते में ओवरराइड का उपयोग नहीं करना चाहिए।

+1

उपर्युक्त संदर्भ में इसका क्या अर्थ है? –

+0

@WernerErasmus इसका मतलब है कि आपको इसका उपयोग नहीं करना चाहिए :) –

+0

गलत। आपका उदाहरण मेरा जैसा नहीं है। –

2

9.2 क्लास सदस्यों (मसौदा N4140)

virt-specifier-seq: 
    virt-specifier 
    virt-specifier-seq virt-specifier 
virt-specifier: 
    override 
    final 

[9.2/8]

A virt-specifier-seq shall contain at most one of each virt-specifier. A virt-specifier-seq shall appear only in the declaration of a virtual member function (10.3).

तो जहाँ तक मैं देख सकते हैं, override मुक्त कार्यों के लिए लागू नहीं किया जा सकता से, तो मैं उम्मीद नहीं करता कि इसे एक मुक्त फ़ंक्शन के हस्ताक्षर/प्रकार में अनुमति दी जायेगी (भले ही यह const जैसे प्रकार का हिस्सा था)।

+0

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

+0

@WernerErasmus मुझे जो कुछ मतलब था, स्पष्टीकरण के लिए संपादित नहीं किया गया (मुझे उम्मीद है :)) – melak47

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