2012-08-15 17 views
10

私は、作成しているライブラリのカスタムエラークラスを作成するためにC++ 11 system_errorエラーコードライブラリを使用しています。私はこれまでにboost::error_codeでこれをやっていましたが、それはstd::error_codeと一緒に働くことができません。私はGCC 4.6を使用しています。エラーコードenumを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オブジェクトに私のカスタム列挙型を変換するには、エラークラス、error_category、およびSTD名前空間の変換ルーチンを作成するために、すべての定型コードを打ち出してきました

問題は私のエラーコードの列挙型と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の専門化がそれを処理すると思った?

答えて

8

error_code make_error_code(mylib::errc::my_error e)の機能をstdからエラー名前空間(mylib::errc)に移動する必要があります。 http://ideone.com/eSfeeを確認してください。

関連する問題