【发布时间】:2011-06-20 20:27:56
【问题描述】:
我现在正在玩 D2,我想编写一些简单的程序,但我遇到了运算符强制重载的问题……我有一个可以强制转换为 Normal 的 Vector 类:
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(T == Normal)) 不匹配”
如果我省略演员表:
immutable Vector v = new Vector(0F,0F,0F);
消息更改,但程序无法编译:
"不能将 Vector 类型的表达式 (new Vector(0F,0F,0F)) 隐式转换为不可变(Vector)"
如果我在 Vector 类中省略强制转换运算符重载,则所有编译都很好。
换一种方式...如何将实例分配或强制转换为不可变的“var”?
【问题讨论】:
-
我认为你应该能够做到'auto v = new immutable(Vector)(0f,0f,0f);'
-
“类向量”是一个非常糟糕的主意。我向您保证,您不想为您执行的每个向量操作强制分配内存。请改用“结构向量”。 请。
标签: operator-overloading immutability d