boost::system::error_code
(ブースト1.62.0)を使用して、C++でカスタムエラーコードを定義しています細分化された例:'make_error_code'はこのスコープで宣言されておらず、インスタンス化の時点で引数依存ルックアップによって宣言が見つかりません
#include <boost/system/error_code.hpp>
#include <boost/system/system_error.hpp>
namespace mynamespace {
enum class MyErrorCodeEnum : int {
ERROR1 = 1,
ERROR2 = 2,
};
class MyErrorCategory: public boost::system::error_category
{
public:
static const MyErrorCategory& instance() {
static MyErrorCategory category;
return category;
}
// error_category interface
public:
virtual const char* name() const noexcept {
return "MyErrorCategory";
}
virtual std::string message(int ev) const {
return "dummy";
}
};
}
namespace boost {
namespace system {
inline error_code make_error_code(const mynamespace::MyErrorCodeEnum e) {
return error_code(static_cast<int>(e), mynamespace::MyErrorCategory::instance());
}
inline error_condition make_error_condition(const mynamespace::MyErrorCodeEnum e) {
return error_condition(static_cast<int>(e), mynamespace::MyErrorCategory::instance());
}
template<>
struct is_error_code_enum<mynamespace::MyErrorCodeEnum>: public std::true_type {};
}
}
int main(int argc, char *argv[])
{
throw boost::system::error_code(mynamespace::MyErrorCodeEnum::ERROR1);
}
これはMSVCを使ってうまくいきました。しかし、mingwの5.3.0に移動しようとすると、次のエラーがコンパイラによって報告された:それは報告されている理由
boost/system/error_code.hpp: In instantiation of 'boost::system::error_code::error_code(ErrorCodeEnum, typename boost::enable_if<boost::system::is_error_code_enum<ErrorCodeEnum> >::type*) [with ErrorCodeEnum = mynamespace::MyErrorCodeEnum; typename boost::enable_if<boost::system::is_error_code_enum<ErrorCodeEnum> >::type = void]':
main.cpp:52:70: required from here
boost/system/error_code.hpp:329:32: error: 'make_error_code' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
*this = make_error_code(e);
^
main.cpp:35:19: note: 'boost::system::error_code boost::system::make_error_code(mynamespace::MyErrorCodeEnum)' declared here, later in the translation unit
inline error_code make_error_code(const mynamespace::MyErrorCodeEnum e) {
^
私が見ることができる、それがのコンストラクタによって参照された後(make_error_code
関数が宣言されていますerror_code
テンプレートクラス)、どうすればこの問題を解決できますか?ありがたいことに
注釈:実際のコードは、直接ERROR_CODEではなく、それを中心に構築SYSTEM_ERRORをスローしないでしょう。しかし、それでも問題は変わりません。 – DevCybran
'Make_error_code'宣言をクラス' MyErrorCategory'の前に置いてください。 –
これは何も変わりません。 – DevCybran