微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编译错误:Boost.Range / MPL 中没有名为“type”的类型

如何解决编译错误:Boost.Range / MPL 中没有名为“type”的类型

编译以下代码时,编译器 (clang 10.0.1) 在 error: no type named 'type'...Boost.Range 库依赖项深处生成 boost::adaptors::transformed

我应该如何更改模板函数 result_data_type 以避免此编译器错误

代码为;

struct request_data {
    std::string data;
    size_t      length = 0;
};

struct error {
    std::string message;
};

template <typename T> 
using result_value = boost::variant<T,error>;

template <typename T> 
auto result_data_type(result_value<T>&& input) -> result_value<T> {
    return boost::apply_visitor(
        make_visitor([](const T& req) { return req; },[](const error&) {
                         throw std::runtime_error("SHOULD_NEVER_HAPPEN");
                         return T();
                     }),input);
};

BOOST_AUTO_TEST_CASE(template_test) {
    using result_data = result_value<request_data>;

    const auto vec_in =
        std::vector<result_data>{result_data{request_data{"Hi",2}},result_data{request_data{"there!",6}}};
    auto vec_out =
        vec | boost::adaptors::transformed(result_data_type<request_data>);
}

完整的错误输出是;

[main] Building folder: aljam 
[build] Starting build
[proc] Executing command: /Applications/CMake.app/Contents/bin/cmake --build /Users/alan/github/aljam/build --config Debug --target aljam -- -j 6
[build] Scanning dependencies of target aljam
[build] [  2%] Building CXX object CMakeFiles/aljam.dir/cpp_playground/aljam.cpp.o
[build] In file included from /Users/alan/github/aljam/cpp_playground/aljam.cpp:9:
[build] In file included from /Users/alan/github/boost_1_73_0/boost/test/unit_test.hpp:18:
[build] In file included from /Users/alan/github/boost_1_73_0/boost/test/test_tools.hpp:46:
[build] In file included from /Users/alan/github/boost_1_73_0/boost/test/tools/old/impl.hpp:28:
[build] In file included from /Users/alan/github/boost_1_73_0/boost/numeric/conversion/conversion_traits.hpp:13:
[build] In file included from /Users/alan/github/boost_1_73_0/boost/numeric/conversion/detail/conversion_traits.hpp:17:
[build] In file included from /Users/alan/github/boost_1_73_0/boost/numeric/conversion/detail/Meta.hpp:16:
[build] /Users/alan/github/boost_1_73_0/boost/mpl/eval_if.hpp:38:26: error: no type named 'type' in 'boost::result_of<boost::variant<aljam::request_data,aljam::error> (*const &(const boost::variant<aljam::request_data,aljam::error> &))(boost::variant<aljam::request_data,aljam::error> &&)>'
[build]     typedef typename f_::type type;
[build]             ~~~~~~~~~~~~~^~~~
[build] /Users/alan/github/boost_1_73_0/boost/iterator/iterator_adaptor.hpp:149:9: note: in instantiation of template class 'boost::mpl::eval_if<boost::is_same<boost::use_default,boost::use_default>,boost::result_of<boost::variant<aljam::request_data,aljam::error> &&)>,boost::mpl::identity<boost::use_default> >' requested here
[build]       : mpl::eval_if<
[build]         ^
[build] /Users/alan/github/boost_1_73_0/boost/iterator/transform_iterator.hpp:48:26: note: in instantiation of template class 'boost::iterators::detail::ia_dflt_help<boost::use_default,aljam::error> &&)> >' requested here
[build]         typedef typename ia_dflt_help<
[build]                          ^
[build] /Users/alan/github/boost_1_73_0/boost/iterator/transform_iterator.hpp:80:40: note: in instantiation of template class 'boost::iterators::detail::transform_iterator_base<boost::variant<aljam::request_data,aljam::error> (*)(boost::variant<aljam::request_data,aljam::error> &&),std::__1::__wrap_iter<const boost::variant<aljam::request_data,aljam::error> *>,boost::use_default,boost::use_default>' requested here
[build]     : public boost::iterators::detail::transform_iterator_base<UnaryFunc,Iterator,Reference,Value>::type
[build]                                        ^
[build] /Users/alan/github/boost_1_73_0/boost/range/adaptor/transformed.hpp:33:30: note: in instantiation of template class 'boost::iterators::transform_iterator<boost::variant<aljam::request_data,boost::use_default>' requested here
[build]                     typename transform_iterator<P,It>::reference
[build]                              ^
[build] /Users/alan/github/boost_1_73_0/boost/range/adaptor/transformed.hpp:42:26: note: in instantiation of template class 'boost::range_detail::transform_iterator_gen<boost::variant<aljam::request_data,aljam::error> *> >' requested here
[build]                 typename transform_iterator_gen<
[build]                          ^
[build] /Users/alan/github/aljam/cpp_playground/aljam.cpp:564:13: note: in instantiation of template class 'boost::range_detail::transformed_range<boost::variant<aljam::request_data,const std::__1::vector<boost::variant<aljam::request_data,aljam::error>,std::__1::allocator<boost::variant<aljam::request_data,aljam::error> > > >' requested here
[build]         vec | boost::adaptors::transformed(result_data_type<request_data>);
[build]             ^
[build] In file included from /Users/alan/github/aljam/cpp_playground/aljam.cpp:19:
[build] In file included from /Users/alan/github/aljam/functional/range.hpp:17:
[build] /Users/alan/github/boost_1_73_0/boost/range/adaptor/transformed.hpp:57:20: error: no type named 'reference' in 'boost::iterators::transform_iterator<boost::variant<aljam::request_data,boost::use_default>'
[build]                 >::reference
[build]                 ~~~^~~~~~~~~
[build] /Users/alan/github/aljam/cpp_playground/aljam.cpp:564:13: note: in instantiation of template class 'boost::range_detail::transformed_range<boost::variant<aljam::request_data,aljam::error> > > >' requested here
[build]         vec | boost::adaptors::transformed(result_data_type<request_data>);
[build]             ^
[build] In file included from /Users/alan/github/aljam/cpp_playground/aljam.cpp:19:
[build] In file included from /Users/alan/github/aljam/functional/range.hpp:17:
[build] /Users/alan/github/boost_1_73_0/boost/range/adaptor/transformed.hpp:96:19: error: no matching constructor for initialization of 'transformed_range<boost::variant<aljam::request_data,aljam::error> > > >'
[build]            return transformed_range<UnaryFunction,const SinglePassRange>(
[build]                   ^
[build] /Users/alan/github/aljam/cpp_playground/aljam.cpp:564:13: note: in instantiation of function template specialization 'boost::range_detail::operator|<std::__1::vector<boost::variant<aljam::request_data,aljam::error> > >,boost::variant<aljam::request_data,aljam::error> &&)>' requested here
[build]         vec | boost::adaptors::transformed(result_data_type<request_data>);
[build]             ^
[build] /Users/alan/github/boost_1_73_0/boost/range/adaptor/transformed.hpp:62:13: note: candidate constructor not viable: no kNown conversion from 'boost::variant<aljam::request_data,aljam::error> (*const)(boost::variant<aljam::request_data,aljam::error> &&)' to 'boost::range_detail::transformed_range<boost::variant<aljam::request_data,aljam::error> > > >::transform_fn_type' (aka 'int') for 1st argument
[build]             transformed_range(transform_fn_type f,R& r)
[build]             ^
[build] /Users/alan/github/boost_1_73_0/boost/range/adaptor/transformed.hpp:40:16: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument,but 2 were provided
[build]         struct transformed_range :
[build]                ^
[build] /Users/alan/github/boost_1_73_0/boost/range/adaptor/transformed.hpp:40:16: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument,but 2 were provided
[build] 3 errors generated.
[build] make[3]: *** [CMakeFiles/aljam.dir/cpp_playground/aljam.cpp.o] Error 1
[build] make[2]: *** [CMakeFiles/aljam.dir/all] Error 2
[build] make[1]: *** [CMakeFiles/aljam.dir/rule] Error 2
[build] make: *** [aljam] Error 2
[build] Build finished with exit code 2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?