Я не совсем уверен, как это объяснить, поэтому, пожалуйста, попросите меня прояснить все, что не имеет смысла. У меня есть интерфейс и шаблонная функция, которая возвращает функцию, которые возвращают анонимные внутренние классы, основанные на время компиляции аргумента:Зачем мне нужен 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.Exception.....(102): need opCmp for class mymodule.getMyInterfaceFactory!("someargument").getMyInterfaceFactory.__funcliteral14.__anonclass13
Итак, я посмотрел на метания линии в источнике druntime, и это выглядит как стандартная реализация opCmp для объекта только броски. Я не сравниваю заводские функции или MyInterface
в любом месте. I am 10 am хранения фабрик как значений строкового индексированного ассоциативного массива, но opCmp не требовался, когда я хранили анонимные классы непосредственно в этом массиве, только когда я начал хранить функции. Если я вставляю opCmp (используя адрес памяти), все, кажется, работает нормально, но MyInterface не очень сопоставимо, поэтому я бы предпочел не делать этого, если только не придется. Если возможно, я хотел бы знать, почему/где opCmp вызывается в анонимных классах, и как я могу предотвратить или обойти его.
Примечание: реализация opCmp по умолчанию в объекте включает комментарий, смутно ссылающийся на ошибку, сопоставленное сравнение адресов памяти и затем метательную версию.
Спасибо!
Редактировать: Следует упомянуть, я попробовал как windbg, так и ddbg отслеживать, где именно был вызван opCmp, но в обоих случаях это не удалось. Windbg не дал никакой полезной информации, потому что он упорно отказывался загружать любые символы, ddbg загружены символы, но исключение происходит во время инициализации (после статических конструкторов модуля, но перед основными) и предположительно ddbg не имел доступа к druntime символам?
Я не знаю много о проблеме, но одним обходным решением было бы разместить общую реализацию opCmp в шаблоне mixin (вы можете использовать 'typeof (this)' для вывода типов параметров). Затем вы можете добавить его в свой класс с помощью одной строки кода. –
Хорошо, если я не могу избежать определения opCmp, я, вероятно, попытаюсь свести его к минимуму. Благодаря! – Tim
Почему существует тип возврата void, и вы возвращаете что-то? –