访问具有相同名称的不同结构

Access to different struct with same name

本文关键字:结构 访问      更新时间:2023-10-16

我正在尝试实现boost版本的解决方案,这些版本会导致c++ 11模式下链接上的范围枚举问题:参见https://svn.boost.org/trac/boost/ticket/6779和https://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枚举的函数。

这是可能的吗?

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

有条件地编译代码的"竞争"变体只会引起ODR违规和虚假的ABI不兼容问题。