D语言中使用extern(Windows)类重载Object方法时的问题
Posted honan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D语言中使用extern(Windows)类重载Object方法时的问题相关的知识,希望对你有一定的参考价值。
使用D语言已经有快20天了,已经完成项目需要的基本功能,但还需进一步完善。
最近两三天在DGUI基础上移植了几个Window窗口控件,有TreeList(树+列表视图),DataList(数据列表),MdiFrom(多窗口),IEWebBrowser(IE浏览器),SciEditor(Sci源代码编辑器),DockPanel(notpad的Docking插件),SysHeader(表头控件),
SysLink等几个标准Windows控件。
感谢DGUI的作者,对Windows控件做的布局管理及封装,真是特别的优秀。
在使用Windows接口时发现一个无法重载的问题. 代码如下:
import std.stdio; import core.sys.windows.unknwn; import core.sys.windows.windows; class MyClass : IUnknown{ HRESULT QueryInterface(IID* riid, void** pvObject){return 0;} ULONG AddRef(){return 0;} ULONG Release(){return 0;} override int opCmp(Object o) { return super.opCmp(o); } } int main(string[] argv){ MyClass my = new MyClass(); return 0; }
编译时出错错误:
错误 1 Error: function main.MyClass.opCmp does not override any function, did you mean to override \'object.Object.opCmp\'? D:\\temp\\ConsoleApp8\\ConsoleApp8\\main.d 11
提示无法重载。
这是因为当MyClass从IUnknown接口继承后,因为IUnknown为extern(Windows)类型,所以MyClass也为extern(Windows)类型,这时候override int opCmp(Object o)因为符号使用extern(Windows)格式,而无法与Object.opComp方法对应上,从而无法重载。导致编译失败。
解决这个问题,只需要明确指定opComp方法为extern(D)类型就可以了。如下:
import std.stdio; import core.sys.windows.unknwn; import core.sys.windows.windows; class MyClass : IUnknown{ HRESULT QueryInterface(IID* riid, void** pvObject){return 0;} ULONG AddRef(){return 0;} ULONG Release(){return 0;} extern(D) override int opCmp(Object o) { return super.opCmp(o); } } int main(string[] argv){ MyClass my = new MyClass(); return 0; }
-------------------------------------------------------------------------------------------------------------------
另外一个需要思考的问题是,D语言中是不能调用C++中的构造函数,要实现可能需要分析C++中的new函数实现C++中的类在D语言中的构造 。
作者:宛宏南
以上是关于D语言中使用extern(Windows)类重载Object方法时的问题的主要内容,如果未能解决你的问题,请参考以下文章