string bformat(string const & fmt, string const & arg1)
{
return (boost::format(fmt) % arg1).str();
}
int main()
{
std::cout << bformat("Creating directory %1$s and running configure...",
"/home/foo/.bar")
<< std::endl;
return 0;
}
Code attached.
This compiles fine on the Linux Alpha machine using g++ 3.3.3
using either the boost libraries of lyx 1.4.x (boost version 1.31)
or of 1.3.x (boost version 1.29).
(The latter requires the throw_exception function to compile.)
Compiled as
$ g++ -I${PATH_TO}/boost -g -o trial trial.C
It runs fine when compiled against the version 1.29 of the boost
library but aborts when compiled against the version 1.31 library.
Backtrace below.
Does anyone else see this with g++ 3.3 or is it a 64bit peculiarity?
Angus
(gdb) where
#0 0x00000200002384a8 in kill () from /lib/libc.so.6.1
#1 0x0000020000238224 in raise () from /lib/libc.so.6.1
#2 0x0000020000239bb0 in abort () from /lib/libc.so.6.1
#3 0x00000200000ff638 in __cxa_call_unexpected () from /usr/lib/libstdc++.so.5
#4 0x00000200000ff690 in std::terminate() () from /usr/lib/libstdc++.so.5
#5 0x00000200000ff82c in __cxa_throw () from /usr/lib/libstdc++.so.5
#6 0x0000020000098d30 in std::__throw_length_error(char const*) ()
from /usr/lib/libstdc++.so.5
#7 0x00000200000ed348 in std::string& std::string::_M_replace_safe<char
const*>(__gnu_cxx::__normal_iterator<char*, std::string>,
__gnu_cxx::__normal_iterator<char*, std::string>, char const*, char const*) () from
/usr/lib/libstdc++.so.5
#8 0x00000200000e9a34 in std::string::append(char const*, unsigned long) ()
from /usr/lib/libstdc++.so.5
#9 0x0000000120008ec8 in void boost::io::detail::(anonymous namespace)::mk_str<char,
std::char_traits<char> >(std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&, char const*, long, long, char, std::_Ios_Fmtflags, char,
bool) ([EMAIL PROTECTED], beg=0x1200265e8 "/home/foo/.bar", size=-1, w=0,
fill_char=32 ' ', f=4098, prefix_space=0 '\0', center=false)
at feed_args.hpp:73
#10 0x0000000120008568 in void boost::io::detail::(anonymous namespace)::put<char,
std::char_traits<char>, std::string const&>(std::string const&,
boost::io::detail::format_item<char, std::char_traits<char> > const&,
std::basic_string<char, std::char_traits<char>, std::allocator<char> >&,
boost::io::basic_outsstream<char, std::char_traits<char> >&) ([EMAIL PROTECTED],
[EMAIL PROTECTED],
[EMAIL PROTECTED], [EMAIL PROTECTED]) at feed_args.hpp:165
#11 0x0000000120007544 in void boost::io::detail::distribute<char,
std::char_traits<char>, std::string const&>(boost::basic_format<char,
std::char_traits<char>
>&, std::string const&) ([EMAIL PROTECTED], [EMAIL PROTECTED])
at feed_args.hpp:241
#12 0x00000001200056c8 in boost::basic_format<char, std::char_traits<char> >&
boost::io::detail::feed<char, std::char_traits<char>, std::string
const&>(boost::basic_format<char, std::char_traits<char> >&, std::string const&) (
[EMAIL PROTECTED], [EMAIL PROTECTED]) at feed_args.hpp:249
#13 0x0000000120003b0c in operator%<std::basic_string<char, std::char_traits<char>,
std::allocator<char> > > (this=0x11ffff6e0, [EMAIL PROTECTED])
at format_class.hpp:61
#14 0x00000001200035f8 in bformat(std::string const&, std::string const&) (
[EMAIL PROTECTED], [EMAIL PROTECTED]) at trial.C:11
#15 0x0000000120003748 in main () at trial.C:16
--
Angus
#include <boost/format.hpp>
#include <string>
#include <iostream>
#include <exception>
#include <cassert>
using std::string;
string bformat(string const & fmt, string const & arg1)
{
return (boost::format(fmt) % arg1).str();
}
int main()
{
std::cout << bformat("Creating directory %1$s and running configure...",
"/home/foo/.bar")
<< std::endl;
return 0;
}
namespace boost {
void throw_exception(std::exception const & e)
{
std::cerr << "Exception caught:\n"
<< e.what() << std::endl;
assert(false);
}
}