Really in need of help with std.container.array.d
anonymous via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Oct 20 03:56:42 PDT 2014
On Sunday, 19 October 2014 at 22:19:05 UTC, Nordlöw wrote:
> https://github.com/nordlow/phobos/commit/ce6b9e9ae600b7c28ecddd1e3af7b1516247fb33
>
> now errors as
>
> array.d(927,15): Error: None of the overloads of 'opSlice' are
> callable using a const object, candidates are:
> array.d(472,25):
> std.container.array.Array!int.Array.opSlice()
> array.d(495,25):
> std.container.array.Array!int.Array.opSlice(ulong i, ulong j)
The error is because of this (lines 470 through 483):
----
static if (isMutable!T)
{
Range!(Array!T) opSlice()
{
return typeof(return)(this, 0, length);
}
}
else
{
Range!(const(Array!T)) opSlice() const
{
return typeof(return)(this, 0, length);
}
}
----
You're disabling the const version when T is mutable. Consider
const(Array!int): T is int is mutable, so there is no const
opSlice. But the Array itself is const, so the non-const version
can't be used. Do not disable the const versions of the methods.
Only ever disable the non-const ones.
Also, the opSlice we're looking at here is Array's, not
Array.Range's. You don't need to touch Array's methods at all.
Only Array.Range's non-const methods need special treatment,
because you need to catch the special case when the Range is
mutable, but the referenced Array is not.
And it's really `isMutableA!`, not `isMutable!T`. I guess you
went for that because `A` is only defined in Array.Range, not in
Array itself. But T's mutability isn't of interest.
For example, Array.Range.opSlice should look like this:
----
static if (isMutable!A) /* !A, not !T */
{
Range!(A) opSlice() {/* ... */}
Range!(A) opSlice(size_t i, size_t j) {/* ... */}
}
/* No `else`, the const versions should always be
available. */
Range!(const(A)) opSlice() const {/* ... */}
Range!(const(A)) opSlice(size_t i, size_t j) const {/*
... */}
----
Then there are still various methods of Array.Range left to be
`static if(isMutable!A)` guarded:
* move*
* opIndex
* opSlice*
By the way, since we're in D.learn, I'm assuming you want to do
this yourself. But if you'd like, I could make a pull request
with my suggestions to your branch.
More information about the Digitalmars-d-learn
mailing list