Hi guys,
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.
Regards
Jess
******************** main.cpp
#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;
}
******************** compile/run tests
jess@flathead:~$ g++ --version
g++ (Ubuntu 5.3.1-14ubuntu2) 5.3.1 20160413
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
(boost 1.55)
jess@flathead:~$ g++ -std=c++14 main.cpp
jess@flathead:~$ ./a.out
123
blah
456
0
(boost 1.61)
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&>&’