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
#include
#include
#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 Tuple1;
typedef boost::fusion::tuple Tuple2;
typedef boost::fusion::tuple 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, T
...>::vector_data(boost::fusion::vector_detail::each_elem, U&& ...) [with U
= {const boost::fusion::tuple&, const boost::fusion::tuple&, const bool&>&>&}; long unsigned int ...I = {0ul,
1ul}; T = {const boost::fusion::tuple&, const
boost::fusion::tuple&, 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 bool&>&>&}; T = {const
boost::fusion::tuple&, const
boost::fusion::tuple&, 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 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’
: store(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&]’:
/usr/local/include/boost/fusion/container/vector/vector.hpp:230:52:
required from ‘constexpr
boost::fusion::vector_detail::vector_data, T
...>::vector_data(boost::fusion::vector_detail::each_elem, U&& ...) [with U
= {const boost::fusion::tuple&, const boost::fusion::tuple&, const bool&>&>&}; long unsigned int ...I = {0ul,
1ul}; T = {const boost::fusion::tuple&, const
boost::fusion::tuple&, 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 bool&>&>&}; T = {const
boost::fusion::tuple&, const
boost::fusion::tuple&, 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 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&’
: 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 bool&>&]’:
/usr/local/include/boost/fusion/container/vector/vector.hpp:230:52:
required from ‘constexpr
boost::fusion::vector_detail::vector_data, T
...>::vector_data(boost::fusion::vector_detail::each_elem, U&& ...) [with U
= {const boost::fusion::tuple&, const boost::fusion::tuple&, const bool&>&>&}; long unsigned int ...I = {0ul,
1ul}; T = {const boost::fusion::tuple&, const
boost::fusion::tuple&, 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 bool&>&>&}; T = {const
boost::fusion::tuple&, const
boost::fusion::tuple&, 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 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 bool&>&’