我在某个电子文件中有以下代码:
<'
package my_package;
struct packet {
foo() is {
print "Hello";
};
};
'>
我的顶级文件导入了几个文件,包括这个文件,并且在某些时候调用了foo()方法。
现在,我错误地添加了这段代码:
struct packet {};
在其他一些文件中(我忘了我已经有一个名为“packet”的结构),它在上面的文件之前由top导入。
奇怪的是,当我尝试加载顶级文件时,我收到了这个错误:
*** Error: 'p' (of type main::packet) does not have 'foo()' method.
at line 9 in top.e
p.foo();
但是为什么它没有在定义foo()的文件上失败?
它有一个数据包的结构声明,但是数据包已经(错误地)在早期文件中声明,所以为什么它没有给出重复的类型名称错误?是否允许有两个具有相同名称的结构?
答案 0 :(得分:3)
实际上,并不是主要包装优先。 但是,当某个文件中使用类型名称时,该文件所属的同一个包具有优先权。 在这种情况下,top.e文件可能没有任何&#34;包&#34;声明,所以它也属于包主。 如果top.e有&#34;打包my_package&#34;,那么&#34; packet&#34;在它将解析为my_package :: packet(而不是main :: packet),并且没有错误。
答案 1 :(得分:2)
您可以为不同的结构使用相同的名称,但必须在不同的包中定义它们。在您的情况下,您首先在packet
包中定义my_package
。我猜测你添加的其他代码是在其他没有行package my_package;
的文件中。这意味着您在packet
包中定义了另一个名为main
的结构。这实际上意味着您有两种不同的类型:my_package::struct
和main::struct
。在main::packet
中,您没有定义任何foo()
函数(您也可以从错误消息中看到)。正如Yuti所提到的,在你的top.e文件中,你可能没有声明一个包,所以main
包优先于任何其他包。
作为练习,如果您将top.e中的代码更改为my_package::packet
而不是简单地packet
,那么它将会起作用。无论如何,您可以从错误消息中看到错误。您知道自己期望my_package::packet
,但是您创建的是main::packet
。
查看Specman e语言参考,第28节“封装构造”以获取有关包的更多信息。