[疑难] 关于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 支持得不好
Global site tag (gtag.js) - Google Analytics