We're trying out the latest version of Boost (1.61, migrating from 1.55) and have some code calling the fusion library that now doesn't compile and it's not obvious (to me at least) why. I've created a simple program (below) to demonstrate the issue. As per the compile/run section below, this compiles and runs with Boost 1.55, not with 1.61.
If anyone has any idea or pointers to what is wrong here I'd really appreciate it. Sorry if this isn't the right forum for this kind of issue too - if so please let me know how best to seek help on this.
#include <boost/fusion/algorithm/iteration/for_each.hpp>
#include <boost/fusion/view/zip_view.hpp>
#include <boost/fusion/tuple.hpp>
#include <iostream>
#include <string>
struct Helper
{
template<typename Arg>
void operator()(const Arg& arg) const
{
std::cout << boost::fusion::get<0>(arg) << std::endl;
std::cout << boost::fusion::get<1>(arg) << std::endl;
}
};
int main()
{
const int myint(123);
const double mydub(456.0);
const std::string mystr("blah");
const bool mybool(false);
typedef boost::fusion::tuple<const int&, const double&> Tuple1;
typedef boost::fusion::tuple<const std::string&, const bool&> Tuple2;
typedef boost::fusion::tuple<const Tuple1&, const Tuple2&> Tuple3;
Helper helper;
boost::fusion::for_each(
boost::fusion::zip_view<Tuple3>(
Tuple3(Tuple1(myint, mydub), Tuple2(mystr, mybool))),
helper);
return 0;
}
jess@flathead:~$ g++ -std=c++14 main.cpp
In file included from /usr/local/include/boost/fusion/container/vector/vector10.hpp:25:0,
from /usr/local/include/boost/fusion/view/transform_view/transform_view.hpp:22,
from /usr/local/include/boost/fusion/algorithm/transformation/transform.hpp:11,
from /usr/local/include/boost/fusion/view/zip_view/detail/begin_impl.hpp:14,
from /usr/local/include/boost/fusion/view/zip_view/zip_view.hpp:16,
from /usr/local/include/boost/fusion/view/zip_view.hpp:12,
from main.cpp:2:
/usr/local/include/boost/fusion/container/vector/vector.hpp: In instantiation of ‘constexpr boost::fusion::vector_detail::vector_data<std::integer_sequence<long unsigned int, _Idx ...>, T ...>::vector_data(boost::fusion::vector_detail::each_elem, U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; long unsigned int ...I = {0ul, 1ul}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’:
/usr/local/include/boost/fusion/container/vector/vector.hpp:305:97: required from ‘boost::fusion::vector<T>::vector(U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’
/usr/local/include/boost/fusion/view/zip_view/zip_view.hpp:128:30: required from ‘constexpr boost::fusion::zip_view<Sequences>::zip_view(const Sequences&) [with Sequences = boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>]’
main.cpp:32:64: required from here
/usr/local/include/boost/fusion/container/vector/vector.hpp:230:52: error: mismatched argument pack lengths while expanding ‘boost::fusion::vector_detail::store<I, T>’
: store<I, T>(std::forward<U>(var))...
^
/usr/local/include/boost/fusion/container/vector/vector.hpp: In instantiation of ‘constexpr boost::fusion::vector_detail::store<<anonymous>, T>::store() [with long unsigned int <anonymous> = 0ul; T = const boost::fusion::tuple<const int&, const double&>&]’:
/usr/local/include/boost/fusion/container/vector/vector.hpp:230:52: required from ‘constexpr boost::fusion::vector_detail::vector_data<std::integer_sequence<long unsigned int, _Idx ...>, T ...>::vector_data(boost::fusion::vector_detail::each_elem, U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; long unsigned int ...I = {0ul, 1ul}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’
/usr/local/include/boost/fusion/container/vector/vector.hpp:305:97: required from ‘boost::fusion::vector<T>::vector(U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’
/usr/local/include/boost/fusion/view/zip_view/zip_view.hpp:128:30: required from ‘constexpr boost::fusion::zip_view<Sequences>::zip_view(const Sequences&) [with Sequences = boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>]’
main.cpp:32:64: required from here
/usr/local/include/boost/fusion/container/vector/vector.hpp:137:24: error: value-initialization of reference type ‘const boost::fusion::tuple<const int&, const double&>&’
: elem() // value-initialized explicitly
^
/usr/local/include/boost/fusion/container/vector/vector.hpp: In instantiation of ‘constexpr boost::fusion::vector_detail::store<<anonymous>, T>::store() [with long unsigned int <anonymous> = 1ul; T = const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&]’:
/usr/local/include/boost/fusion/container/vector/vector.hpp:230:52: required from ‘constexpr boost::fusion::vector_detail::vector_data<std::integer_sequence<long unsigned int, _Idx ...>, T ...>::vector_data(boost::fusion::vector_detail::each_elem, U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; long unsigned int ...I = {0ul, 1ul}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’
/usr/local/include/boost/fusion/container/vector/vector.hpp:305:97: required from ‘boost::fusion::vector<T>::vector(U&& ...) [with U = {const boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>&}; T = {const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&}]’
/usr/local/include/boost/fusion/view/zip_view/zip_view.hpp:128:30: required from ‘constexpr boost::fusion::zip_view<Sequences>::zip_view(const Sequences&) [with Sequences = boost::fusion::tuple<const boost::fusion::tuple<const int&, const double&>&, const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&>]’
main.cpp:32:64: required from here
/usr/local/include/boost/fusion/container/vector/vector.hpp:137:24: error: value-initialization of reference type ‘const boost::fusion::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const bool&>&’