
Hello, I run into the problem to provide ostream operator<< support for spirit's debug facility and for lazyness using fusion's io support: ---8<--- #include <boost/fusion/include/adapt_struct.hpp> #include <boost/fusion/include/io.hpp> #include <iostream> namespace fusion = boost::fusion; namespace client { struct point { int x,y; }; template<typename CharT> std::basic_ostream<CharT>& operator<<(std::basic_ostream<CharT>& os, point const& p) { os << p; return os; } struct arc { int radius; point begin; point end; }; template<typename CharT> std::basic_ostream<CharT>& operator<<(std::basic_ostream<CharT>& os, arc const& a) { os << a; return os; } } BOOST_FUSION_ADAPT_STRUCT( client::point, (int, x) (int, y) ) BOOST_FUSION_ADAPT_STRUCT( client::arc, (int, radius) (client::point, begin) (client::point, end) ) int main() { client::arc arc; std::cout << arc << '\n'; } --->8--- This program crashs, I would assume operator<<(..., arc) calls infinity recursive fusion's operator<< or similar - that's what I would interpret from gdb's backtrace. How to prevent this? I don't like to investigate much effort of formatting to supporting spirit's debug support and conventional debugging by tracing the selective printed output (like printf debugging) since there is support for formatted output of fusion sequences. Thanks, Olaf

On Sat, May 4, 2013 at 11:03 PM, Olaf Peter <ope-devel@gmx.de> wrote:
Hello,
I run into the problem to provide ostream operator<< support for spirit's debug facility and for lazyness using fusion's io support:
---8<--- #include <boost/fusion/include/adapt_**struct.hpp> #include <boost/fusion/include/io.hpp> #include <iostream>
namespace fusion = boost::fusion;
namespace client {
struct point { int x,y; };
template<typename CharT> std::basic_ostream<CharT>& operator<<(std::basic_ostream<**CharT>& os, point const& p) { os << p;
As is, this just infinitely recurses, as you observed. What do you want to do here? Call the Fusion-provided operator<<? Does explicitly qualifying work? E.g., fusion::operator<<(os, p). [...] - Jeff

As is, this just infinitely recurses, as you observed. What do you want to do here? Call the Fusion-provided operator<<? Does explicitly qualifying work? E.g., fusion::operator<<(os, p).
oh, yes - the simplest solution: using the explicitly qualifying fusion::operator<<(os, p) works! Thanks, Olaf
participants (2)
-
Jeffrey Lee Hellrung, Jr.
-
Olaf Peter