Я сейчас играю с D2, я хотел бы написать какую-нибудь простую программу, но я застрял с перегрузкой приведения оператора ... У меня есть класс Vector, который можно привести к Normal:
class Vector {
public float x,y,z;
this(in float x, in float y, in float z){
this.x = x;
this.y = y;
this.z = z;
}
//..............
Normal opCast(T)() if (is(T == Normal)){
return new Normal(this.x,this.y,this.z);
}
}
Если я пишу что-то вроде
immutable Vector v = cast(immutable(Vector))new Vector(0F, 0F, 0F);
, компилятор жалуется, что:
"экземпляр шаблона opCast! (Immutable (Vector)) не соответствует объявлению шаблона opCast (T) if (is (is (T == Normal)) "
Если я опускаю приведение:
immutable Vector v = new Vector(0F,0F,0F);
сообщение изменяется, но программа не компилируется:
" не может неявно преобразовать выражение(новый Vector (0F, 0F, 0F)) типа Vector to immutable (Vector) "
Если я опускаю перегрузку оператора приведения в классе Vector, все компилируется просто отлично.
Поместить по-другому ... Как я могу назначить или привести экземпляр к неизменному 'var'?