> > in both of your solutions, you assumed that the
> > "and"-function is defined even
> > for the array type. But you didn't define that function like e.g.
>
> This is untrue, see RM 4.5.1(6).
>
> Actually the original program (the second variant with Standard."and")
> works correctly with the GNAT compiler (but not with ObjectAda).
But that is a bug in GNAT.
The predefined "and" is *not* declared in package Standard (despite what
GNAT things ;-). It is declared where the array type is
declared. However, because there is a matching user-defined "and"
declared immediately in the same scope, the predefined
"and" is not visible. The suggested fix, with a separate
array type, and then a definition of the private type
as being derived from that, works.
Another approach that works is to declare an array type local to
the body of "and", and convert to that. That works because
array conversion works between unrelated array types, presuming
they are structurally equivalent.
Note that the desire to export some but not all of the predefined
operators of the full type for a private type is a frequent one,
and has been discussed a fair bit in the past. We imagined various
"magic" syntaxes, such as:
function "and"(left, right : the_type) return the_type renames <>;
where in this case, "<>" stands for the hidden predefined definition.
However, lacking such "magic" language constructs, you are generally
stuck using derived types, multiple renames, etc.
> -Stephane
-Tucker Taft [log in to unmask]
>
> ----
> Stephane Barbey, PhD phone: +41(31)828.92.17
> Paranor AG fax: +41(31)828.92.99
> 3046 Wahlendorf [log in to unmask]
> Switzerland http://lglwww.epfl.ch/~barbey
|