2013-04-13 5 views
5

मुझे नीचे दिए गए कोड के साथ कोई समस्या है।व्युत्पन्न अपवाद रचनाकारों का उत्तराधिकारी नहीं है

#include <iostream> 
#include <stdexcept> 

class MyException : public std::logic_error { 
}; 

void myFunction1() throw (MyException) { 
    throw MyException("fatal error"); 
}; 

void myFunction2() throw (std::logic_error) { 
    throw std::logic_error("fatal error"); 
}; 

int main() { 
    try { 
     myFunction1(); 
     //myFunction2(); 
    }catch (std::exception &e) { 
     std::cout << "Error.\n" 
      << "Type: " << typeid(e).name() << "\n" 
      << "Message: " << e.what() << std::endl; 
    } 
    return 0; 
} 

throw MyException("fatal error"); लाइन काम नहीं करता। माइक्रोसॉफ्ट विजुअल स्टूडियो 2012 यह कहता है:

error C2440: '<function-style-cast>' : cannot convert from 'const char [12]' to 'MyException' 

मिनजीडब्ल्यू की प्रतिक्रिया बहुत समान थी।

इसका मतलब है कि निर्माता std::logic_error(const string &what) को मूल वर्ग से बच्चे में कॉपी नहीं किया गया था। क्यूं कर?

आपके उत्तर के लिए धन्यवाद।

उत्तर

7

कंस्ट्रेटर्स का निर्माण एक सी ++ 11 सुविधा है जो सी ++ 03 में उपलब्ध नहीं है (जो आप उपयोग कर रहे हैं, जैसा कि मैं गतिशील अपवाद विनिर्देशों से बता सकता हूं)।

हालांकि, यहां तक ​​में सी ++ 11 यदि आप एक आधार वर्ग के निर्माता के वारिस के लिए एक using घोषणा की आवश्यकता होगी:

class MyException : public std::logic_error { 
public: 
    using std::logic_error::logic_error; 
}; 

इस मामले में, तुम सिर्फ स्पष्ट रूप से एक निर्माता है कि एक std::string या एक लेता है लिखने के लिए है const char* और आगे यह आधार वर्ग के निर्माता रहे हैं:

class MyException : public std::logic_error { 
public: 
    MyException(std::string const& msg) : std::logic_error(msg) { } 
}; 
+0

मैं एक अन्य परियोजना, जहां मैं एक पहली बार के लिए इस समस्या से मुलाकात में सी ++ 11 का उपयोग करें। मैं 'उपयोग' भाग कैसे कर सकता हूं? वैसे भी, आपका समाधान पूरी तरह से काम करता है। धन्यवाद –

+1

@ आर्टूरआईवान: देर से उत्तर के लिए खेद है, थोड़ी देर के लिए छोड़ना पड़ा। मैंने वाक्यविन्यास दिखाने के लिए उत्तर अद्यतन किया। हालांकि, मुझे लगता है कि वीसी 11 विरासत रचनाकारों का समर्थन नहीं करता है। –

+0

मैंने आपके "उपयोग" समाधान का परीक्षण किया है और जैसा कि आपने कहा है, विजुअल स्टूडियो अभी तक इसका समर्थन नहीं करता है। –

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