2014-05-15 57 views
1

我有一些電子文件下面的代碼:它是否允許有兩個同名的結構?

<' 
package my_package; 

struct packet { 
    foo() is { 
     print "Hello"; 
    }; 
}; 

'> 

而我的首要文件導入多個文件,其中包括這一個,並在某些時候它會調用,把foo()方法。在其他一些文件

struct packet {}; 

(我忘了,我已經有一個名爲「包」結構),它是由頂部的上述文件之前進口:現在

,誤我加入這個代碼。

奇怪的是,當我試圖加載第一個文件,我得到這個錯誤:

*** Error: 'p' (of type main::packet) does not have 'foo()' method. 
       at line 9 in top.e 
     p.foo(); 

但爲什麼沒有它已經失敗的定義FOO文件()?

它有一個數據包的結構聲明,但數據包已經(錯誤地)在早期的文件中聲明,所以爲什麼它沒有給出重複的類型名稱錯誤?它是否允許有兩個同名的結構?

回答

2

您可以爲不同的結構使用相同的名稱,但它們必須在不同的包中定義。在你的情況下,你首先在my_package包中定義packet。我猜你添加的其他代碼是在其他文件中沒有行package my_package;。這意味着您在main包中定義了另一個名爲packet的結構。這實際上意味着您有兩種不同的類型:my_package::structmain::struct。在main::packet中,您沒有定義任何foo()函數(正如您從錯誤消息中也可以看到的那樣)。正如Yuti提到的,​​在您的top.e文件中,您可能沒有聲明包,因此main包優先於任何其他包。

作爲一項練習,如果您將top.e中的代碼更改爲my_package::packet,而不是簡單地將其改爲packet,那麼它就會起作用。無論如何,您可以從錯誤消息中看到錯誤。你知道你期望my_package::packet,但你正在創建一個main::packet

查看Specman e語言參考,第28節,封裝構造以獲取有關包的更多信息。

3

實際上,並不是主包優先。 但是,當在某個文件中使用類型名稱時,該文件所屬的同一個包優先。 在這種情況下,top.e文件可能沒有任何「包」語句,所以它也屬於包main。 如果top.e有「package my_package」,那麼它中的「packet」將解析爲my_package :: packet(而不是main :: packet),並且不會有錯誤。

相關問題