De la réponse here j'ai mis ma classe NotImplementedException
NotImplementedException 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?
1. 'std :: logic_error' a des constructeurs explicites. Vous devriez appeler l'un d'eux. –
2. Lisez ceci: https://stackoverflow.com/questions/10948316/throw-new-stdexception-vs-throw-stdexception –
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