别名boost :: variant或std :: variant不可编译

时间:2018-01-20 20:52:11

标签: c++ boost c++17

目前我的库使用boost :: optional和boost :: variant。由于C ++ 17已经发布,我想添加一个选项,它可以与boost和std一起使用。

因此,我使用boost optional和variant以及std可选和变体成功测试了完整代码。

所以我添加了一个与此类似的头文件:

#ifdef USE_BOOST
#include <boost/optional.hpp>
#elif USE_STD
#include <optional>
#endif

namespace Foo {

#ifdef USE_BOOST
template <typename T>
using optional = boost::optional<T>
#elif USE_STD
template <typename T>
using optional = std::optional<T>
#endif

}

一切都很好。

然后我为变种添加了类似的东西

#ifdef USE_BOOST
#include <boost/variant.hpp>
#elif USE_STD
#include <variant>
#endif

namespace Foo {

#ifdef USE_BOOST
template <typename... T>
using variant = boost::variant<T...>
// similar to the following
#elif USE_STD

template <typename...T>
using variant = std::variant<T...>;

template <class T, class... Types>
constexpr T& get(std::variant<Types...>& v) {
    return std::get<T>(v);
};

template <class T, class... Types>
constexpr T&& get(std::variant<Types...>&& v) {
    return std::get<T>(std::move(v));
};

template <class T, class... Types>
constexpr const T& get(const std::variant<Types...>& v) {
    return std::get<T>(v);
};

template <class T, class... Types>
constexpr const T&& get(const std::variant<Types...>&& v) {
    return std::get<T>(std::move(v));
};

#endif

}

在库中我现在使用Foo :: optional和Foo :: variant。但现在所有功能模板如

template <typename... Args>
bool bar(const std::tuple<variant<Args,
                                  std::exception_ptr>...>& args)
找不到

了。 (clang错误消息:没有匹配函数来调用...)

使用clang trunk和VS 2017测试15.6.1预览 有什么想法吗?

非常感谢提前!

编辑:我的gist

中有一个最小的例子

1 个答案:

答案 0 :(得分:0)

最后问题解决了。这是一个吵闹的VS. GCC编译得很好。 clang和VS的解决方案是使用显式模板参数调用函数。