2011/4/11 Maxime van Noppen <maxime@altribe.org>
Hi,
I've got a question about the reuse of the boost::format object. Given this minimal testcase:
----------------------------------------------------------- #include <iostream> #include <boost/format.hpp>
int main() { boost::format fmt("%|=12| %|=12| %|=12|\n");
// 1 std::cout << boost::str(fmt % "a" % "b" % "c") << boost::str(fmt % 1 % 2 % 3);
// 2 std::cout << fmt % "a" % "b" % "c" << fmt % 1 % 2 % 3; } -----------------------------------------------------------
Why is 1 working while 2 produces the runtime exception:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::io::too_many_args> ' what(): boost::too_many_args: format-string referred to less arguments than were passed
?
I believe a possible reason is that order of evaluation of the operations is unspecified. A simple example of this mechanism would be: int i = 0; cout << i++ << ++i; // what will this print? It's unspecified and compiler dependant To make your example work, try: cout << fmt % "a" % "b" % "c"; cout << fmt % 1 % 2 % 3; Regards Kris