我现在正在玩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类型的表达式(新Vector(0F,0F,0F))隐式转换为不可变(Vector)”
如果我在Vector类中省略了cast运算符重载,那么所有编译都很好。
以不同的方式...如何将实例分配或转换为不可变的'var'?
答案 0 :(得分:1)
你不应该正常超载opCast
。
通常名为 toTypename 的方法用于知道如何将自身转换为另一个的对象。
Normal toNormal () { return new Normal (x, y, z); }
答案 1 :(得分:0)
您有两种解决方案:
一个漂亮的解决方案是Trass3r在他的评论中已经提到的:将immmutable(Vector)
视为自己的数据类型(它是),并调用其构造函数。
一个更丑陋的解决方案是对要投射的对象使用assumeUnique()
。我想你可能需要导入一个库(std.exception
,如果我没错的话)。