2017-03-21 5 views
0

De la réponse here j'ai mis ma classe NotImplementedExceptionNotImplementedException C++

//exceptions.h 
namespace base 
{ 
    class NotImplementedException : public std::logic_error 
    { 
    public: 
     virtual char const* what() { return "Function not yet implemented."; } 
    }; 
} 

Dans une autre classe, je voudrais jeter l'exception suivante (même espace de noms):

std::string to_string() override 
    { 
     throw NotImplementedException(); 
    } 

La méthode to_string est un outrepassée méthode à partir d'une classe de base abstraite.

namespace BSE { 
    class BaseObject 
    { 
     virtual std::string to_string() = 0; 
    }; 
} 

Malheureusement, la compilation du code précédent me montre cette erreur:

error C2280: BSE::NotImplementedException::NotImplementedException(void)': attempting to reference a deleted function` 

De here je compris que le problème qu'il a quelque chose à voir avec le constructeur de déplacement ou de la cession qui, selon cppreference.com - throw (1) cela pourrait être le cas:

First, copy-initializes the exception object from expression (this may call the move constructor for rvalue expression, and the copy/move may be subject to copy elision)

J'ai essayé d'ajouter

NotImplementedException(const NotImplementedException&) = default; 
    NotImplementedException& operator=(const NotImplementedException&) = default; 

à ma classe, mais qui me donne

error C2512: 'BSE::NotImplementedException': no appropriate default constructor available 

et pour autant que je sache std::logic_error n'a pas de constructeur par défaut défini.

Q: Comment faire pour contourner ce problème?

+0

1. 'std :: logic_error' a des constructeurs explicites. Vous devriez appeler l'un d'eux. –

+0

2. Lisez ceci: https://stackoverflow.com/questions/10948316/throw-new-stdexception-vs-throw-stdexception –

+0

Ah, en fait le 'nouveau' s'est glissé là parce que je jouais autour - ce n'était pas intentionnel. Et cela signifie-t-il que l'implémentation que j'ai trouvée est fausse? Ou y a-t-il des circonstances différentes dont je ne suis pas au courant? – Philipp

Répondre

3

Il devrait être quelque chose comme:

namespace base 
{ 
    class NotImplementedException : public std::logic_error 
    { 
    public: 
     NotImplementedException() : std::logic_error{"Function not yet implemented."} {} 
    }; 
} 

Et puis

std::string to_string() override 
{ 
    throw NotImplementedException(); // with new. 
} 
+0

Fonctionne maintenant, merci! – Philipp