On 6/19/16 5:19 PM, Joerg Joergonson wrote:
On Sunday, 19 June 2016 at 20:21:35 UTC, ag0aep6g wrote:
On 06/19/2016 09:59 PM, Joerg Joergonson wrote:
This should be completely valid since B!T' obviously derives from A!T
directly
ok
and we see that T' derives from b which derives from a
directly.
ok
So B!b is an entirely derived from A!a
No. B!b is derived from A!b, not from A!a. `b` being derived from `a`
does not make A!b derived from A!a.
why not? This doesn't seem logical!
Because:
class A(T : a)
{
static if(is(T == a))
int oops;
...
}
Now A!b and A!a have different layouts. They cannot be related, even if
the template arguments are related. I could introduce another virtual
function inside the static if, same result -- vtable is messed up.
In general, an instantiation of a template aggregate (class or struct)
is not castable implicitly to another instantiation of the same
aggregate unless explicitly declared.
And note that D does not allow multiple inheritance. I don't think you
can solve this problem in D.
-Steve