2017-08-24 6 views
0

Je suis still en passant par std :: error_code et j'essaie maintenant de rendre ma liste d'enum d'erreurs équivalente à std :: error_code. Je suis ce qui est tutoriel this mais pour une raison que je ne peux pas le faire fonctionner, je finis toujours avec l'erreur No viable conversion from 'my_project::my_error' to 'std::error_code'.Essayer de rendre mon enum équivalent à std :: error_code

C'est ce que je travaille avec:

#include <system_error> 
#include <string> 

namespace std { 

    enum class my_error; 

    template <> 
    struct is_error_condition_enum<my_error> : public true_type {}; 
} 

namespace my_project { 
    enum class my_error { 
    warning = 45836431 
    }; 

    namespace internal { 
    struct my_error_category : public std::error_category { 
     const char* name() const noexcept override { 
     return "AAA"; 
     } 
     std::string message(int ev) const noexcept override { 
     const std::string message = "BBB"; 
     return message; 
     } 
    }; 
    } 
} 

inline std::error_code make_error_code(const my_project::my_error &e) { 
    return {static_cast<int>(e), my_project::internal::my_error_category()}; 
}; 

int main() 
{ 
    std::error_code ec = my_project::my_error::warning; 
} 
+0

Vous avez écrit 'make_error_code()' mais vous ne l'utilisez pas. – Frank

+1

Aussi, je pense que la façon dont vous étendez l'espace de noms std provoque un comportement indéfini: https://stackoverflow.com/questions/41062294/c-when-is-it-ok-to-extend-the-std-namespace, http: //fr.cppreference.com/w/cpp/language/extending_std – KjMag

+0

@Frank Selon le tutoriel, je ne devrais pas en avoir besoin? Peut-être que je le mal interprète. – ruipacheco

Répondre

1

Cela fonctionne:

#include <system_error> 
#include <string> 

namespace my_project { 
    enum class my_error { 
    warning = 45836431 
    }; 
} 

namespace std { 
    // you had a typo here, and you defined a different std::my_error class 
    template <> 
    struct is_error_code_enum<my_project::my_error> : public true_type {}; 
} 

namespace my_project { 

    namespace internal { 
    struct my_error_category : public std::error_category { 
     const char* name() const noexcept override { 
     return "AAA"; 
     } 
     std::string message(int ev) const noexcept override { 
     const std::string message = "BBB"; 
     return message; 
     } 
    }; 
    } 

inline std::error_code make_error_code(const my_project::my_error &e) { 
    return {static_cast<int>(e), my_project::internal::my_error_category()}; 
}; 
} 

int main() 
{ 
    std::error_code ec = my_project::my_error::warning; 
} 

messages d'erreur de Clang me mettre sur la bonne voie, car il m'a dit pourquoi il n'a pas utilisé le droit constructeur.