c – 将错误代码枚举与std :: error_code进行比较

c – 将错误代码枚举与std :: error_code进行比较,第1张

概述我正在使用C 11 system_error错误代码库为我正在制作的库创建自定义错误类.我以前用boost :: error_code做了这个,但我不能很好的使用std :: error_code.我使用GCC 4.6. 基本上,我已经布置了所有的样板代码来创建一个错误类,一个error_category以及STD命名空间中的转换例程,将我的自定义枚举转换成std :: error_code对象: 我正在使用C 11 system_error错误代码库为我正在制作的库创建自定义错误类.我以前用boost :: error_code做了这个,但我不能很好的使用std :: error_code.我使用GCC 4.6.

基本上,我已经布置了所有的样板代码来创建一个错误类,一个error_category以及STD命名空间中的转换例程,将我的自定义枚举转换成std :: error_code对象:

namespace mylib{    namespace errc {        enum my_error        {            Failed = 0        };        inline const char* error_message(int c)        {            static const char* err_msg[] =             {                "Failed",};            assert(c < sizeof(err_msg) / sizeof(err_msg[0]));            return err_msg[c];        }        class my_error_category : public std::error_category        {            public:            my_error_category()            { }            std::string message(int c) const            {                 return error_message(c);             }            const char* name() const { return "My Error category"; }            const static error_category& get()            {                const static my_error_category category_const;                return category_const;            }        };    } // end namespace errc} // end namespace mylibnamespace std {inline error_code make_error_code(mylib::errc::my_error e){    return error_code(static_cast<int>(e),mylib::errc::my_error_category::get());}template<>struct is_error_code_enum<mylib::errc::my_error>    : std::true_type{ };

问题是,我的错误代码枚举和std :: error_code对象之间的隐式转换似乎不起作用,所以我不能像例如尝试使用枚举文字比较std :: error_code的一个实例:

int main(){    std::error_code ec1 = std::make_error_code(mylib::errc::Failed); // works    std::error_code ec2 = mylib::errc::Failed; // doesn't compile    bool result = (ec2 == mylib::errc::Failed); // doesn't compile}

表达式ec2 == mylib :: errc :: Failed不会编译 – 我不得不说ec2 == std :: make_error_code(mylib :: errc :: Failed).

编译器发出的错误是:

In file included from test6.cc:3:0:/usr/include/c++/4.6/system_error: In constructor ‘std::error_code::error_code(_ErrorCodeEnum,typename std::enable_if<std::is_error_code_enum<_ErrorCodeEnum>::value>::type*) [with _ErrorCodeEnum = mylib::errc::my_error,typename std::enable_if<std::is_error_code_enum<_ErrorCodeEnum>::value>::type = voID]’:test6.cc:70:37:   instantiated from here/usr/include/c++/4.6/system_error:127:9: error: cannot convert ‘mylib::errc::my_error’ to ‘std::errc’ for argument ‘1’ to ‘std::error_code std::make_error_code(std::errc)’

这是一个Ideone link.

那么,为什么这不工作?我需要额外的样板代码,以使mylib :: errc :: my_error枚举能够隐式转换为std :: error_code?我以为std :: make_error_code的专业化照顾了?

解决方法 您必须将error_code make_error_code(mylib :: errc :: my_error e)函数从std移动到您的错误命名空间(mylib :: errc).请检查 http://ideone.com/eSfee. 总结

以上是内存溢出为你收集整理的c – 将错误代码枚举与std :: error_code进行比较全部内容,希望文章能够帮你解决c – 将错误代码枚举与std :: error_code进行比较所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1233409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存