【问题标题】:Access to different struct with same name访问具有相同名称的不同结构
【发布时间】:2015-09-30 15:48:28
【问题描述】:

我正在尝试为在 C++11 模式下链接时导致作用域枚举出现问题的 boost 版本实施一种解决方法:请参阅 https://svn.boost.org/trac/boost/ticket/6779https://svn.boost.org/trac/boost/ticket/10038

问题很简单:大多数预分发的 boost 库都暴露(名称空间被剥离):
detail::copy_file(path const&, path const&, copy_option::enum_type, error_code*)
但是 C++11 编译试图找到:
detail::copy_file(path const&, path const&, copy_option, error_code*)
由于这个事实,C++98 boost 使用模拟作用域枚举,而不是 C++11 的枚举。

虽然我可以编写一个适配器,将其放入自己的目标文件并将其链接到程序中,但我的幼稚方法失败了:

#define copy_option native_copy_option__
#include <boost/filesystem/operations.hpp>
#undef copy_option

namespace boost {
namespace filesystem {

    struct copy_option{
        enum enum_type{none, fail_if_exists = none, overwrite_if_exists};
    };

namespace detail {

    void copy_file(const path& from, const path& to, copy_option::enum_type option, system::error_code* ec=0);

    using copy_option = native_copy_option__;
    void copy_file(const path& from, const path& to, copy_option option, system::error_code* ec)
    {
        copy_file(from, to, static_cast<boost::filesystem::copy_option::enum_type>(option), ec);
    }

}  // namespace detail
}  // namespace filesystem
}  // namespace boost

问题是:我需要在签名中定义一个带有 C++11 枚举的函数,还需要声明一个具有相同名称的 C++98 枚举的函数。

这有可能吗?

【问题讨论】:

    标签: c++ c++11 boost enums


    【解决方案1】:

    我认为您应该只编写可移植的代码。

    有条件地编译代码的“竞争”变体只会引发 ODR violations 和虚假的 ABI 不兼容问题。

    【讨论】:

    • 我正在尝试针对常规包管理器安装中常见的版本中的已知提升错误实施解决方法。所以在这种情况下我别无选择。
    • 你可以选择不使用包管理器版本...这是一个选择
    • 当然。但这是在超级计算环境中使用的。用户安装和编译自己的 boost 版本通常不是一个可行的选择,但他们必须使用所提供的内容。
    猜你喜欢
    • 2019-10-14
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    相关资源
    最近更新 更多