The following program compiles fine:
interface I
{}
class B : I
{}
class C : B
{
int i;
}
void main()
{
auto c = new C;
auto i = cast(I)c; // compiles
auto b = cast(B)c; // compiles
}
Let's add an unrelated opCast to C:
class C : B
{
int i;
int opCast(T : int)()
{
return i;
}
}
Now the last two lines of main fail to compile:
Error: template instance opCast!(I) does not match template declaration
opCast(T : int)()
Error: template instance opCast!(B) does not match template declaration
opCast(T : int)()
Is this per spec? (Actually, where is the spec? (Trick question. ;) )
There is a workaround: Add a catch-all opCast that forwards to the
all-powerful std.conv.to:
T opCast(T)()
{
import std.conv;
return this.to!T;
}
Now it compiles and works as expected.
However, the question remains...
Thank you,
Ali