私は、作成しているライブラリのカスタムエラークラスを作成するために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
の専門化がそれを処理すると思った?