
Here are several patches to improve portability for this library: - options_description.hpp: The m_default_line_length is for me an implementation detail. As static constant are well known as not being portable I propose to use the dedicated BOOST_STATIC_CONSTANT macro in this case. I also move it to the private section as I think it is the place it must be but of course it do not change the portability aspect if it is retore back to the public section. - options_description.cpp: C++ Standard library implementors needs compiler partial template specialization support in order to offer the Standard reverse_iterator definition. Using reverse_iterator in this source introduce a major limitation in terms of compilers able to support it. As the only thing you need is a reverse_iterator on string::const_iterator the simplest solution is to use the string::const_reverse_iterator typedef. This way you simply rely on Standard library quality, I expect that all compilers with partial template specialization have a Standard string coming with a const_reverse_iterator typedef. - variables_map.cpp: A classic for loop internal variable problem, i is defined 2 times with a different type in 2 different for loop. I fix it by using an iterator approach to enumerate the desc.options() container. Thanks to those patches I build the lib with the msvc-stlport toolset with no problem. Bests *** options_description.hpp.orig Tue Aug 30 07:34:41 2005 --- options_description.hpp Tue Aug 30 21:05:22 2005 *************** *** 152,160 **** @sa option_description */ class BOOST_PROGRAM_OPTIONS_DECL options_description { public: - static const unsigned m_default_line_length = 80; - /** Creates the instance. */ options_description(unsigned line_length = m_default_line_length); /** Creates the instance. The 'caption' parameter gives the name of --- 152,159 ---- @sa option_description */ class BOOST_PROGRAM_OPTIONS_DECL options_description { + BOOST_STATIC_CONSTANT(unsigned, m_default_line_length = 80); public: /** Creates the instance. */ options_description(unsigned line_length = m_default_line_length); /** Creates the instance. The 'caption' parameter gives the name of *** options_description.cpp.orig Tue Aug 30 07:42:10 2005 --- options_description.cpp Tue Aug 30 07:43:28 2005 *************** *** 375,382 **** { // find last ' ' in the second half of the current paragraph line string::const_iterator last_space = ! find(reverse_iterator<string::const_iterator>(line_end - 1), ! reverse_iterator<string::const_iterator>(line_begin - 1), ' ') .base(); --- 375,382 ---- { // find last ' ' in the second half of the current paragraph line string::const_iterator last_space = ! find(string::const_reverse_iterator(line_end - 1), ! string::const_reverse_iterator(line_begin - 1), ' ') .base(); *** variables_map.cpp.orig Tue Aug 30 07:46:25 2005 --- variables_map.cpp Tue Aug 30 07:48:48 2005 *************** *** 80,92 **** } xm.m_final.insert(new_final.begin(), new_final.end()); - - // Second, apply default values. ! const vector<shared_ptr<option_description> >& all = desc.options(); ! for(unsigned i = 0; i < all.size(); ++i) { ! const option_description& d = *all[i]; string key = d.key(""); // FIXME: this logic relies on knowledge of option_description // internals. --- 80,91 ---- } xm.m_final.insert(new_final.begin(), new_final.end()); // Second, apply default values. ! vector<shared_ptr<option_description> >::const_iterator optIt(desc.options().begin()), ! optItEnd(desc.options().end()); ! for (; optIt != optItEnd; ++optIt) { ! const option_description& d = *(*optIt); string key = d.key(""); // FIXME: this logic relies on knowledge of option_description // internals.