簡體   English   中英

將錯誤代碼枚舉與std :: error_code進行比較

[英]Comparing an error code enum with 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 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
{ }; 


問題是,我的錯誤代碼枚舉和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鏈接

那么,為什么這不起作用? 我是否需要額外的樣板代碼才能使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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM