C++ 11获取错误'enum-type'没有命名带有boost的类型1.59 fileSystem
当我用C++ 11编译我的代码时,出现以下错误。 与以前的标准它工作正常没有编译问题。 (C++ 03)C++ 11获取错误'enum-type'没有命名带有boost的类型1.59 fileSystem
签名的函数:) 升压::文件系统:: copy_option :: enum_type myFunc的(
错误: '枚举类型' 在“枚举类的boost ::文件系统:: copy_option”没有指定类型
增压版本:1.59 编译:gcc版本:4.8.5
我想这可能是由于在C++ 11枚举类。 但是我没有任何线索如何解决这个问题。 。
回答:
如果我们看一下在V 1.59.0提高文件系统的文件,我们发现boost::filesystem::copy_option
被定义为:
enum class copy_option {
none
fail_if_exists = none,
overwrite_if_exists
};
但enum class
是一个C++ 11的功能,所以怎么也包括以往任何时候都头在C++ 03模式下工作?让我们来看一看在头boost/filesystem/header.hpp,我们看到copy_option
定义(内boost::filesystem
)为:
BOOST_SCOPED_ENUM_START(copy_option) {none=0, fail_if_exists = none, overwrite_if_exists};
BOOST_SCOPED_ENUM_END
搜索的位变成了那个BOOST_SCOPED_ENUM_START
和BOOST_SCOPED_ENUM_END
是Boost.Core库的一部分。 scoped_enum reference page解释其目的是“如果编译器支持该功能,则生成C++ 11范围枚举,否则使用C++ 03构造来模拟它”。它也表示BOOST_SCOPED_ENUM_START
和BOOST_SCOPED_ENUM_END
已被弃用。所以让我们回顾一下。
据我所知,除Boost 1.40.0 boost/detail/scoped_enum_emulation.hpp中的头文件本身外,这些宏首先没有任何文档出现。它被用于来自Boost.Filesystem的相同目的。
当时没有copy_option::none
值。所以,如果Boost.Config自动的定义BOOST_NO_SCOPED_ENUMS
,枚举的定义扩展到C++ 03兼容的代码:
struct copy_option { enum enum_t { fail_if_exists, overwrite_if_exists };
};
或者,如果BOOST_NO_SCOPED_ENUMS
没有定义,相同的定义扩大到C++ 0x中,唯一的代码(这是之前,C++ 11是官方):
enum class copy_option { fail_if_exists, overwrite_if_exists };
两者都允许和需要书面例如copy_option::overwrite_if_exists
。但有一个问题:在C++ 03模式下,该值的类型为copy_option::enum_t
,但在C++ 0x模式下,类型仅为copy_option
。因此,scoped_enum_emulation.hpp标头定义了第三个宏BOOST_SCOPED_ENUM(EnumName)
,它在C++ 03模式下扩展为EnumName::enum_t
或在C++ 0x模式下扩展为EnumName
。尽管C++ 03版本仍然存在一些问题,例如隐式转换为整数类型......
要获得可在任一情况下工作的代码,建议在需要变量声明时使用BOOST_SCOPED_ENUM(EnumName)
函数参数或函数返回类型为范围枚举类型。这仍然有效,所以你可以通过编写来解决你的问题
BOOST_SCOPED_ENUM(boost::filesystem::copy_option) myFunc();
但是现在还有其他的选择可以考虑。
升压1.44.0从使用enum_t
切换到enum_type
。所以这是您的代码最早可能开始的最老的。
升压1.50.0改变旧的宏BOOST_SCOPED_ENUM_START
和BOOST_SCOPED_ENUM_END
的定义,使他们弃用,并推出新的宏BOOST_SCOPED_ENUM_DECLARE_BEGIN
和BOOST_SCOPED_ENUM_DECLARE_END
来代替。他们还介绍了Boost.Thread下的一些文档,这些文档显然也开始使用它。 Boost.Filesystem的的copy_option
仍然使用旧的宏,但C++ 03的扩展与BOOST_NO_SCOPED_ENUMS
定义成了:
struct copy_option { typedef void is_boost_scoped_enum_tag;
typedef int underlying_type;
copy_option() {}
explicit copy_option(underlying_type v) : v_(v) {}
underlying_type get_underlying_value_() const { return v_; }
private:
underlying_type v_;
typedef copy_option self_type;
public:
enum enum_type
{none=0, fail_if_exists = none, overwrite_if_exists};
enum_type get_native_value_() const { return enum_type(v_); }
operator enum_type() const { return get_native_value_(); }
friend bool operator ==(self_type lhs, self_type rhs) { return enum_type(lhs.v_)==enum_type(rhs.v_); }
friend bool operator ==(self_type lhs, enum_type rhs) { return enum_type(lhs.v_)==rhs; }
friend bool operator ==(enum_type lhs, self_type rhs) { return lhs==enum_type(rhs.v_); }
friend bool operator !=(self_type lhs, self_type rhs) { return enum_type(lhs.v_)!=enum_type(rhs.v_); }
friend bool operator !=(self_type lhs, enum_type rhs) { return enum_type(lhs.v_)!=rhs; }
friend bool operator !=(enum_type lhs, self_type rhs) { return lhs!=enum_type(rhs.v_); }
friend bool operator <(self_type lhs, self_type rhs) { return enum_type(lhs.v_)<enum_type(rhs.v_); }
friend bool operator <(self_type lhs, enum_type rhs) { return enum_type(lhs.v_)<rhs; }
friend bool operator <(enum_type lhs, self_type rhs) { return lhs<enum_type(rhs.v_); }
friend bool operator <=(self_type lhs, self_type rhs) { return enum_type(lhs.v_)<=enum_type(rhs.v_); }
friend bool operator <=(self_type lhs, enum_type rhs) { return enum_type(lhs.v_)<=rhs; }
friend bool operator <=(enum_type lhs, self_type rhs) { return lhs<=enum_type(rhs.v_); }
friend bool operator >(self_type lhs, self_type rhs) { return enum_type(lhs.v_)>enum_type(rhs.v_); }
friend bool operator >(self_type lhs, enum_type rhs) { return enum_type(lhs.v_)>rhs; }
friend bool operator >(enum_type lhs, self_type rhs) { return lhs>enum_type(rhs.v_); }
friend bool operator >=(self_type lhs, self_type rhs) { return enum_type(lhs.v_)>=enum_type(rhs.v_); }
friend bool operator >=(self_type lhs, enum_type rhs) { return enum_type(lhs.v_)>=rhs; }
friend bool operator >=(enum_type lhs, self_type rhs) { return lhs>=enum_type(rhs.v_); }
};
注意他们现在已经取得了C++ 03型copy_option
成一个类大多是用枚举类型兼容它包围。此外,它在某些情况下更像是一个C++ 11范围枚举:例如,如果opt
是copy_option
,则不能执行opt==1
。所以你可能要考虑只做
boost::filesystem::copy_option myFunc();
改为。最大的问题是(因为使用了旧的宏),copy_option
的构造函数是显式的,所以你必须使用直接初始化而不是复制初始化从枚举值到copy_option
。也就是说,copy_option var = copy_option::fail_if_exists;
和return copy_option::fail_if_exists;
将不起作用,但copy_option var(copy_option::fail_if_exists);
和return copy_option(copy_option::fail_if_exists);
会。
在Boost 1.53.0中,涉及的Boost.Config宏从BOOST_NO_SCOPED_ENUMS
更改为BOOST_NO_CXX11_SCOPED_ENUMS
。
在Boost 1.56.0中,作用域枚举支持移至Boost.Core,文件boost/core/scoped_enum.hpp。
以上是 C++ 11获取错误'enum-type'没有命名带有boost的类型1.59 fileSystem 的全部内容, 来源链接: utcz.com/qa/264031.html