我不确定如何解释这一点,所以请让我澄清任何没有意义的东西。我有一个接口,它返回返回基于编译时的说法匿名内部类函数模板函数:现在为什么我要为一个匿名类“需要opCmp”?
interface MyInterface {
void getName();
}
MyInterface function() getMyInterfaceFactory(string name)() {
return function() {
return new class MyInterface {
void getName() { //Do something involving name here }
};
};
}
,getMyInterfaceFactory()
曾经是getMyInterface()
并用它直接返回匿名对象。一切正常。当我加入了该工厂的功能,我开始从Object启动过程中得到一个例外:
object.Exception.....(102): need opCmp for class mymodule.getMyInterfaceFactory!("someargument").getMyInterfaceFactory.__funcliteral14.__anonclass13
所以,我看着在druntime源行进线,它看起来像opCmp为对象的默认实现只是抛出。我没有比较工厂功能或任何地方的MyInterface
。 I am存储工厂作为字符串索引关联数组的值,但是当我直接在该数组中存储匿名类时,只有当我开始存储函数时,才需要opCmp。如果我插入一个opCmp(使用内存地址),一切似乎都正常工作,但MyInterface并没有真正的可比性,所以我宁愿不这样做,除非必须这样做。 如果可能的话,我想知道为什么/在哪里opCmp被匿名类调用,以及如何防止或解决它。
注意:Object中opCmp的默认实现包含一个模糊的引用bug的注释,注释掉的内存地址比较,然后是引发版本。
谢谢!
编辑:我应该提到,我试过windbg和ddbg来追踪opCmp被调用的位置,但在两种情况下均失败。 Windbg没有提供任何有用的信息,因为它顽固地拒绝加载任何符号,ddbg加载符号,但是在初始化过程中(在静态模块构造函数之后但在main之前)发生异常,并且可能ddbg无法访问druntime符号?
我对这个问题了解不多,但是一种解决方法是将一个通用的opCmp实现放在一个模板mixin中(您可以使用'typeof(this)'来推断这些参数的类型)。然后,您可以用一行代码将它添加到您的课程中。 – 2012-03-17 18:05:45
好点,如果我无法避免定义opCmp,我可能会尽量减少它。谢谢! – Tim 2012-03-17 18:15:18
为什么有一个void返回类型,你返回的东西? – 2012-03-17 23:25:42