问题在于允许内联对象以创建 iostream 样式的字符串的宏。
答案是:
#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
( std::ostringstream().seekp( 0, std::ios_base::cur ) << x ) \
).str()
用法(例如):
throw std::runtime_error(
SSTR( "FooBar error: Value " << x << " exceeds " << y )
);
这很好用 - 使用 GCC。它也在 Visual C++ 2005 下编译和运行。但是对于后者,宏的所有使用都会导致空字符串,我对为什么以及如何修复它感到非常傻眼......?