我逃离有一些非常简单的代码,拒绝编译:从“INOUT地狱”
struct Wrapper(T)
{
T t;
bool opEquals(inout(Wrapper) other) inout
{
return t == other.t;
}
bool opEquals(inout(T) val) inout
{
return t == val;
}
}
struct Test
{
bool opEquals(Test t)
{
return true;
}
}
void main()
{
Wrapper!Test a, b;
assert(a == b);
//Error: inout method Test.opEquals is not
//callable using a mutable object
assert(a == Test());
}
现在,我知道这个问题,这是Test
没有定义的inout
opEquals
。但是,在Test
中定义opEquals
的另一个可变版本不能解决此问题,因为编译器只是忽略它并无论如何调用inout
版本。有没有什么方法可以解决这个问题,而不是诉诸于为易变,const
和immutable
定义opEquals
过载?
你的第二个'Wrapper'中的'opEquals'方法拼写错误。另外,因为'opEquals'不修改它的参数,所以你可以把它设为'const',它可以在可变类型和不可变类型上工作。 –
我认为问题在于,我将'Wrapper.opEquals'标记为'inout',而不是将参数标记为'inout'。从方法中删除'inout'会导致它编译,但如果我创建了'immutable'或'const''Wrapper',那么它将不起作用。 – Meta
如果你使'opEquals'为const,你应该这样做,因为opEquals不应该修改任何东西。 http://dpaste.dzfl.pl/6cab4a419488 –