
On May 2, 2005, at 8:42 AM, Stefan Slapeta wrote:
Howard Hinnant wrote:
The error message is saying that boost::operator >= (ptr_container_detail::reversible_ptr_container< ... animal...>, ...) is being instantiated. If I were to guess, it would be some kind of concepts check. ptr_container_detail::reversible_ptr_container does derive from less_than_comparable.
[...]
Actually, it's instantiated here:
bool operator<( const reversible_ptr_container& r ) const // nothrow { return std::lexicographical_compare( begin(), end(), r.begin(), r.end() ); }
which again is instantiated here:
template <class T, class B = ::boost::detail::empty_base> struct less_than_comparable1 : B { friend bool operator>(const T& x, const T& y) { return y < x; } friend bool operator<=(const T& x, const T& y) { return !(y < x); } friend bool operator>=(const T& x, const T& y) { return !(x < y); } };
Inlined friend functions in class templates are instantiated when the enclosing class template is instantiated whether or not the friend is actually used: 14.5.3p5:
-5- When a function is defined in a friend function declaration in a class template, the function is defined at each instantiation of the class template. The function is defined even if it is never used. The same restrictions on multiple declarations and definitions which apply to non-template function declarations and definitions also apply to these implicit definitions. [Note: if the function definition is ill-formed for a given specialization of the enclosing class template, the program is ill-formed even if the function is never used. ]
This behavior will most likely change for C++0X: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#329 -Howard