Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将错误代码枚举与std::error\u代码进行比较_C++_C++11 - Fatal编程技术网

C++ 将错误代码枚举与std::error\u代码进行比较

C++ 将错误代码枚举与std::error\u代码进行比较,c++,c++11,C++,C++11,我正在使用C++11system\u errorerror-code库为我正在创建的库创建一个自定义错误类。我以前用boost::error\u code做过这件事,但我不能让它用std::error\u code工作。我使用的是GCC4.6 基本上,我已经列出了所有样板代码来创建一个错误类、一个错误类别,以及STD名称空间中的转换例程来将我的自定义枚举转换为一个STD::error\u code对象: namespace mylib { namespace errc {

我正在使用C++11
system\u error
error-code库为我正在创建的库创建一个自定义错误类。我以前用
boost::error\u code
做过这件事,但我不能让它用
std::error\u code
工作。我使用的是GCC4.6

基本上,我已经列出了所有样板代码来创建一个错误类、一个错误类别,以及STD名称空间中的转换例程来将我的自定义枚举转换为一个
STD::error\u 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 mylib

namespace 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
{ }; 
表达式
ec2==mylib::errc::failed
无法编译-我必须说
ec2==std::make\u error\u 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)’
test6.cc:3:0中包含的文件中的
:
/usr/include/c++/4.6/system\u error:inconstructor'std::error\u code::error\u code(\u errorcodenum,typename std::enable_if::type*)[带_errorcodenum=mylib::errc::my_error,typename std::enable_if::type=void]:
test6.cc:70:37:从此处实例化
/usr/include/c++/4.6/system_error:127:9:错误:无法将参数“1”的“mylib::errc::my_error”转换为“std::error\u code std::make_error\u code(std::errc)”
这里有一个


那么,为什么这不起作用呢?我是否需要额外的样板代码才能使
mylib::errc::my_error
枚举隐式转换为
std::error_code
?我认为std::make_error_code的专门化可以解决这个问题。

您必须将
错误代码make_error_code(mylib::errc::my_error e)
函数从
std
移动到您的错误名称空间(
mylib::errc
)。请查收

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)’