[疑难] 关于D的3个疑问
ant-man
2007-09-22
1.在一个模块中定义的一个全局函数,在其他模块中可以引用么?
module a ; void f() { } module b ; import a ; void main() { f() ; //这样可以么?如果可以,怎样限制f()在其他模块总不能调用啊? } 2.我在一个类的私有成员函数中实例化tango.text.convert.layout但是编译器给出如下错误信息,这是怎么回事啊?(我是指wxD中的sample\aui\aui.d里的类成员函数中用的) ..... import tango.text.convert.Layout ; ..... class SizeReportCtrl : Control { public: this(wxWindow parent, int id = -1, Point pos = Window.wxDefaultPosition, Size size = wxDefaultSize, FrameManager mgr = null) { super(parent, id, pos, size, wxNO_BORDER); m_mgr = mgr; EVT_PAINT(&OnPaint); EVT_SIZE(&OnSize); EVT_ERASE_BACKGROUND(&OnEraseBackground); } public void tryit() { auto format = new Layout!(char) ; } .... Compiling: hello.d hello.d(433): template instance Layout is not a template declaration, it is a function hello.d(433): Error: Layout!(char) is used as a type hello.d(433): Error: new can only create structs, dynamic arrays or class objects, not void's 3.可不可以实例化一个模块级的对象啊?比如在一个模块中: module a ; auto format = new Layout!(char) ; 但是编译器说 hello.d(29): Error: non-constant expression new Layout 恳请各路予以指教,不胜感激! |
|
tomqyp
2007-09-22
1.可以的,就是你的代码这样,要想使其它引用b的模块,对b所引用的a不可见只要在b中引用a时用private定义就行了。
2.用法看不出什么问题,应该是对的,我自己试了下也能通过编译,看看你的dmd是什么版本的,我的是1.21,另外wxd中的sample都是比较老的代码,有几个是不能通过编译,而且这个aui的例子是phobo的,你是不是改过。 3.模块的成员可以在static this中初始化。 |
|
Colorful
2007-09-22
1.可以调用。如果想限制其使用范围,可以加private等修饰词语。(PS:这样的问题最好自己先实践一下再来询问。)
2.偶不怎么用Tango库。 但是你的代码 public int tryit() { auto format = new Layout!(char) ; } 没有返回正确的类型。 3.很奇怪的用法。 编译器已经给出明确提示:非常量表达式。 auto format = new Layout!(char); 要在运行时才能计算对象大小,为其分配内存。 编译器无法在编译时完成这些工作。 |
|
tomqyp
2007-09-22
Colorful 写道 2.偶不怎么用Tango库。 但是你的代码 public int tryit() { auto format = new Layout!(char) ; } 没有返回正确的类型。 对啊,竟然没注意到这个 |
|
Colorful
2007-09-22
我相信编译器给出的错误提示并不对应于该处代码,错误应该在未给出的代码中。
BTW,你好像误解楼主的第一点了,呵呵。 我的理解是在函数前加上private,而不是在导入模块前加private。 目前DMD的import == private import,不再是以前的import == public import. tomqyp 写道 Colorful 写道 2.偶不怎么用Tango库。 但是你的代码 public int tryit() { auto format = new Layout!(char) ; } 没有返回正确的类型。 对啊,竟然没注意到这个 |
|
ant-man
2007-09-22
Colorful 写道 1.可以调用。如果想限制其使用范围,可以加private等修饰词语。(PS:这样的问题最好自己先实践一下再来询问。)
2.偶不怎么用Tango库。 但是你的代码 public int tryit() { auto format = new Layout!(char) ; } 没有返回正确的类型。 3.很奇怪的用法。 编译器已经给出明确提示:非常量表达式。 auto format = new Layout!(char); 要在运行时才能计算对象大小,为其分配内存。 编译器无法在编译时完成这些工作。 实在不好意思,犯这个低级错误,我实际实验时用的是 public void tryit() ; |
|
ant-man
2007-09-22
tomqyp 写道 1.可以的,就是你的代码这样,要想使其它引用b的模块,对b所引用的a不可见只要在b中引用a时用private定义就行了。
2.用法看不出什么问题,应该是对的,我自己试了下也能通过编译,看看你的dmd是什么版本的,我的是1.21,另外wxd中的sample都是比较老的代码,有几个是不能通过编译,而且这个aui的例子是phobo的,你是不是改过。 3.模块的成员可以在static this中初始化。 我用的也是1.21,而且我把aui改过了,就是把Phobos的string的format换成tango的layout,我想声明一个在一个模块范围内都能使用的Layout!(char),并把它实例化,但是我在模块开始的时候这样写 auto Formatter = new Layout![char] ; 编译器就报错了:非常量表达式 但是如果我定义一个模块级的函数 char[] Formatter( char[] formatStr, ...) { auto format = new Layout!(char) ; return format(_arguments, _argptr, formatStr) ; } 这样就可以了。 另外,在有的类(比如class MyApp : App)中的成员函数可以 auto format = new Layout!(char) ; 但是在别的类(比如class MyFrame : public Frame)中就报错了: hello.d(433): template instance Layout is not a template declaration, it is a function hello.d(433): Error: Layout!(char) is used as a type hello.d(433): Error: new can only create structs, dynamic arrays or class objects, not void's 怎么回事啊,郁闷ing |
|
oldrev
2007-09-22
"我想声明一个在一个模块范围内都能使用的Layout!(char),并把它实例化,但是我在模块开始的时候这样写 "
是不是指的全局变量?如果是这样,你需要如此: private static Layout!!(char) format; static this() { format = new Layout!(char); } |
|
oldrev
2007-09-22
"我想声明一个在一个模块范围内都能使用的Layout!(char),并把它实例化,但是我在模块开始的时候这样写 "
是不是指的全局变量?如果是这样,你需要如此: private static Layout!!(char) format; static this() { format = new Layout!(char); } |
|
oldrev
2007-09-22
抱歉发送了两次,我的浏览器 Konqueror 对 Ajax 支持得不好
|
相关讨论
相关资源推荐
- Web程序员简历模板,以及如何写一篇优秀的简历
- 推荐:45个优秀的免费web模板
- dropwizard-marionette:基于 Dropwizard 和 Marionette 的模板 Web 应用程序
- 毕业设计So Easy:Java Web图书推荐系统平台
- 分享10 个开源免费且优秀的后台管理系统模板
- Micro:一个用于 Web 的微型 CMS
- 12套 Axure 模板,非常漂亮的中后台原型,可以直接套用在OA、CRM更web系统上。
- 三种风格web前端HTML5模板下载
- MaterialWebAppTemplate:一个 Material WebApp 模板 - 修改简单,使用更少的 javascript
- Bootstrap优秀模板-INSPINIA.2.9.2