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

时间:2015-09-30 15:48:28

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

我尝试为促销版本实施一种解决方法,导致在C ++ 11模式下导致链接范围问题:请参阅https://svn.boost.org/trac/boost/ticket/6779https://svn.boost.org/trac/boost/ticket/10038

问题很简单:大多数预先分发的提升库暴露(名称空间被剥离):
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枚举声明一个函数。

这有可能吗?

1 个答案:

答案 0 :(得分:0)

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

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