मैं एक वर्ग इस तरह परिभाषित किया गया है:विरासत में प्राप्त कंस्ट्रक्टर्स उपेक्षा इन-क्लास प्रारंभ
class ASTConcatenateLiteral : public ASTExpr {
using ASTExpr::ASTExpr;
private:
Type type_ = Type::nothingness(); // Type does not have a default constructor
};
यह बजना के साथ ठीक काम करता है। जीसीसी, हालांकि, मुझे लगता है कि यह डिफ़ॉल्ट प्रारंभकर्ता उपयोग करने के लिए कोशिश कर रहा है कि बनाता है एक त्रुटि संदेश देता है:
error: no matching function for call to ‘EmojicodeCompiler::Type::Type()’
अगर मैं इस तरह एक सार्वजनिक निर्माता के साथ using ASTExpr::ASTExpr;
की जगह (ASTExpr केवल वास्तव में इस निर्माता प्रदान करता है)
ASTConcatenateLiteral(const SourcePosition &p) : ASTExpr(p) {}
सबकुछ ठीक काम करता है।
cppreference.com के अनुसार:
The inherited constructors are equivalent to user-defined constructors with an empty body and with a member initializer list consisting of a single nested-name-specifier, which forwards all of its arguments to the base class constructor.
तो क्यों नहीं है विरासत में मिला निर्माता काम करता है? यदि विरासत वाला कन्स्ट्रक्टर उपयोगकर्ता द्वारा परिभाषित कन्स्ट्रक्टर की तरह व्यवहार करता है, तो इसे type_
के लिए प्रदान किए गए मान का उपयोग करना चाहिए, है ना? मानक के अनुसार कौन सा कंपाइलर्स सही है?
यह g ++ 7.2 के साथ ठीक संकलित करता है। – Holt
@ होल्ट शीश। कोई आश्चर्य नहीं कि मैंने समस्या को पुन: उत्पन्न करने का प्रबंधन नहीं किया है, अगर यह केवल पुराने संस्करणों में विफल रहता है। – hvd
@ होल्ट मैंने 6.2.0 के साथ प्रयास किया। लेकिन उस मामले में मुझे एक बार फिर से जीसीसी संस्करण की आवश्यकता को टक्कर लाना होगा ... – idmean