我不確定如何解釋這一點,所以請讓我澄清任何沒有意義的東西。我有一個接口,它返回返回基於編譯時的說法匿名內部類函數模板函數:現在爲什麼我要爲一個匿名類「需要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