2014-09-19 7 views
10

जीसीसी 4.8.1टेम्पलेट कन्स्ट्रक्टर विरासत के लिए मानक अनुरूप वाक्यविन्यास क्या है?

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass<T>::Baseclass; 
}; 

स्वीकार करता है लेकिन MSVC नहीं करता है। दूसरी ओर, एमएसवीसी

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass::Baseclass; 
}; 

स्वीकार करता है लेकिन जीसीसी नहीं करता है। तब मैं इस सवाल में घोषणा का एक और प्रकार देखा है: c++11 inheriting template constructors जिसके लिए

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass::Baseclass<T>; 
}; 

MSVC एक "अप्रचलित घोषणा शैली" के बारे में चेतावनी दी है और जीसीसी

prog.cpp:8:24: error: ‘template<class T> class Baseclass’ used without template parameters 
     using typename Baseclass::Baseclass<T>; 

मैंने सोचा कि पहले उदाहरण होगा कहते हैं मानक अनुरूप वाक्यविन्यास। सहजता से, यह मेरे लिए सही लग रहा है।

सी ++ 11 मानक अनुरूप वाक्यविन्यास क्या है?

+3

क्या एमएसवीसी संस्करण है? वीएस2013 विरासत रचनाकारों का समर्थन नहीं करता है। AFAIK, पहला एक सही वाक्यविन्यास है। 'बेसक्लास :: बेसक्लास ' का उपयोग उन मामलों के लिए करना चाहिए जहां 'बेस क्लास' स्वयं क्लास टेम्पलेट नहीं है, लेकिन इसमें एक कंस्ट्रक्टर टेम्पलेट है। – Praetorian

+0

@Praetorian अब आश्चर्य की बात है। लेकिन मैंने कभी भी डिफ़ॉल्ट और कॉपी कन्स्ट्रक्टर का उपयोग किया है, और अब एक अलग कन्स्ट्रक्टर का परीक्षण करने के बाद, मुझे लगता है कि आप सही हैं। क्या कॉपी और डिफॉल्ट कन्स्ट्रक्टर स्वचालित रूप से विरासत में हैं? –

+1

आपको मानक की जांच करनी होगी, लेकिन मुझे पूरा यकीन है कि विशेष सदस्य कार्य * कभी * विरासत में नहीं हैं। उनकी पीढ़ी के सामान्य नियमों के बाद उन्हें व्युत्पन्न कक्षा में संकलक द्वारा स्वचालित रूप से घोषित किया जा सकता है। – Praetorian

उत्तर

2

उत्तर मानक में थोड़ा सा दफनाया गया है। एक का उपयोग कर घोषणा के रूप में (7.3.3) परिभाषित किया गया है:

using [typename] nested-name-specifier unqualified-id; 

nested-name-specifier जो के रूप में

template-name < [template-argument-list] > 

संक्षेप में परिभाषित किया गया है simple-template-id में कुछ कदम के बाद निराकरण, मानक अनुरूप वाक्य रचना

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass<T>::Baseclass; 
}; 
है
+0

बहुत बहुत धन्यवाद! –

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