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

因此,我测试了带有boost可选和variant以及std可选和variant成功的完整代码。

所以我添加了一个类似于以下的头文件:

#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)

找不到了。 (c语错误消息:没有匹配的函数可以调用...)

已通过clang trunk和VS 2017 15.6.1 Preview测试
任何的想法?

提前谢谢了!

编辑:一个最小的例子是在我的gist

最佳答案

终于问题解决了。这是在VS中lang的错误。 GCC可以编译。 clang和VS的解决方案是使用显式模板参数调用该函数。

关于c++ - 混淆boost::variant或std::variant无法编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48360986/

10-12 20:47