$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Martin Wille (mw8329_at_[hidden])
Date: 2004-07-01 00:36:19
Eric Niebler wrote:
> Martin Wille wrote:
...
>> #include <boost/minmax.hpp>
>>
>> int foo()
>> {
>>     BOOST_USING_STD_MIN();
>>     return min BOOST_PREVENT_MACRO_SUBSTITUTION(3, 4);
>> }
>>
>> namespace notboost
>> {
>>     template <typename T>
>>     T const &
>>     proxy_min(T const &p, T const &q)
>>     {
>>         BOOST_USING_STD_MIN();
>>         return min BOOST_PREVENT_MACRO_SUBSTITUTION(p, q);  // line 16
>>     }
>> }
>>
>> int bar()
>> {
>>     return notboost::proxy_min(3, 4);                       // line 22
>> }
>>
>>
>> namespace test
>> {
>>     int baz()
>>     {
>>         BOOST_USING_STD_MIN();
>>         return min BOOST_PREVENT_MACRO_SUBSTITUTION(3, 4);
>>     }
>> }
>>
>> int main() { foo(); bar(); test::baz(); }
>>
>>
>> The compiler emits these error messages:
>> min.cpp: In function `const int & notboost::proxy_min<int>(const int 
>> &, const int &)':
>> min.cpp:22:   instantiated from here
>> min.cpp:16: `min' undeclared (first use this function)
>> min.cpp:16: (Each undeclared identifier is reported only once
>> min.cpp:16: for each function it appears in.)
> 
> Ugh. Thanks Martyn. Can you tell me if there is something funny about 
> the way STLPort defines std::min/max? Does it use macros? Or are they 
> defined globally and imported into the std:: namespace with using 
> declarations?
STLPort implements std::min in the namespace _STL.
BOOST_USING_STD_MIN() correctly expands to: using _STL   ::min
The (shortened) result of preprocessing is:
namespace _STL  {
template <class _Tp>
inline const _Tp& (min)(const _Tp& __a, const _Tp& __b) { return __b < 
__a ? __b : __a; }
template <class _Tp>
inline const _Tp& (max)(const _Tp& __a, const _Tp& __b) {  return  __a < 
__b ? __b : __a; }
template <class _Tp, class _Compare>
inline const _Tp& (min)(const _Tp& __a, const _Tp& __b, _Compare __comp) {
   return __comp(__b, __a) ? __b : __a;
}
template <class _Tp, class _Compare>
inline const _Tp& (max)(const _Tp& __a, const _Tp& __b, _Compare __comp) {
   return __comp(__a, __b) ? __b : __a;
}
}
(the complete preprocessed source can be found at: 
http://tinyurl.com/yrflf )
I must be blind, I can't spot the line that hoists the contents of
_STL:: into std::.
> In the worst case, I suppose for this compiler/library combination we 
> can import std::min/max into the boost namespace with a using 
> declaration and make BOOST_USING_STD_MIN() expand to nothing. Martyn, 
> can you try that and see if it works?
Changing the source to
namespace notboost
{
     BOOST_USING_STD_MIN(); // moved to namespace scope
     template <typename T>
     T const &
     proxy_min(T const &p, T const &q)
     {
          return min BOOST_PREVENT_MACRO_SUBSTITUTION(p, q);
     }
}
indeed makes gcc-2.95.3 accept the code.
Regards,
m