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_STARTBOOST_SCOPED_ENUM_END是Boost.Core库的一部分。 scoped_enum reference page解释其目的是“如果编译器支持该功能,则生成C++ 11范围枚举,否则使用C++ 03构造来模拟它”。它也表示BOOST_SCOPED_ENUM_STARTBOOST_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_STARTBOOST_SCOPED_ENUM_END的定义,使他们弃用,并推出新的宏BOOST_SCOPED_ENUM_DECLARE_BEGINBOOST_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范围枚举:例如,如果optcopy_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

回到顶部