digitalmars.D.bugs - Failure to discriminate overloads based on most-derived interface
- Matthew Wilson (98/98) Jul 15 2004 Given the following algorithm:
- Walter (3/4) Jul 16 2004 Yes, please.
Given the following algorithm:
template Utility(T)
{
alias NotionalRange!(T) notional_range_type;
alias RandomAccessRange!(T) random_access_range_type;
size_type r_distance(notional_range_type r)
in
{
assert(null !== r);
}
body
{
size_type n = 0;
for(; r.is_open; r.advance())
{
++n;
}
return n;
}
size_type r_distance(random_access_range_type r)
in
{
assert(null !== r);
}
body
{
return r.length();
}
} // template Numeric
The compiler fails to select the RandomAccessRange overload of r_distance
when given a range instance that derives from that interface.
The range interface inheritance hierarchy is as follows:
First, the range categories:
interface NotionalRangeTag
{}
interface IterableRangeTag
: public NotionalRangeTag
{}
interface SubscriptableRangeTag
: public IterableRangeTag
{}
interface RandomAccessRangeTag
: public SubscriptableRangeTag
{}
Then the range interfaces:
template NotionalRange(T) { interface NotionalRange
: public NotionalRangeTag
{
/// \name Member types
/// {
public:
alias T value_type;
alias NotionalRangeTag range_category;
/// }
/// \name Notional range methods
/// {
public:
bool is_open();
value_type current();
void advance();
/// }
}}
template SubscriptableRange(T) { interface SubscriptableRange
: public NotionalRange!(T)
, public SubscriptableRangeTag
{
/// \name Member types
/// {
public:
alias NotionalRange!(T) parent_class_type;
public:
alias T value_type;
alias ptrdiff_t index_type;
alias size_t size_type;
alias ptrdiff_t difference_type;
alias RandomAccessRangeTag range_category;
/// }
/// \name Notional range methods
/// {
public:
bool is_open();
value_type current();
void advance();
/// }
/// \name Random access range methods
/// {
public:
size_type length();
value_type opIndex(index_type index);
void advance(difference_type increment);
/// }
}}
template RandomAccessRange(T) { interface RandomAccessRange
: public SubscriptableRange!(T)
, public RandomAccessRangeTag
{
}}
Bet you want me to boil that down, eh? :-)
Jul 15 2004
"Matthew Wilson" <admin.hat stlsoft.dot.org> wrote in message news:cd5gg6$1rnv$1 digitaldaemon.com...Bet you want me to boil that down, eh? :-)Yes, please.
Jul 16 2004








"Walter" <newshound digitalmars.com>