2013-10-15 45 views
3

我試圖將一個模塊中創建一個抽象類型Fortran 2003延遲綁定過程的實現是否需要相同的參數?

type, abstract :: AbsType 
    contains 
    procedure (Compute_AbsSize), deferred :: AbsSize 
end type AbsType 
abstract interface 
    function Compute_AbsSize(this) 
     import AbsType 
     double precision Compute_AbsSize 
     class(AbsType)::this 
    end function Compute_AbsSize 
end interface 

type, extends(AbsType) :: ConcrType 
    type(Var), dimension(4) :: Nodes ! coming from a module 
    contains 
    procedure :: AbsSize => ConcrTypeSize 
end type ConcrType 

contains 

function ConcrTypeSize(this) 
     double precision ConcrTypeSize 
     class (ConcrType):: this  ! 
end function ConcrTypeSize 

事實證明,如果我寫

function ConcrTypeSize(TheConcrType) 
     double precision ConcrTypeSize 
     class (ConcrType):: TheConcrType  ! 
end function ConcrTypeSize 

編譯器(GCC)抱怨說,TheConcrType應有的變量同名延期功能。我找不到這些信息,有人知道我爲什麼必須這樣做,這是正確的嗎?

編輯:我搬到了quetion的最後部分 this new question

回答

2

具體在覆蓋特定的父類結合必須有相匹配的名稱和特性啞元的擴展結合,酒吧傳遞的參數的類型(如果有的話)。這在F2008標準的第4.5.7.3節(F2003中的類似詞)中進行了解釋。

編譯器因此是正確的抱怨。請記住,在引用過程時可以使用僞參數的名稱,也可以在綁定的PASS屬性中使用該名稱。參數名稱不匹配在這些情況下沒有意義。

對於你最後一段,我不清楚你到底想要什麼,或者它與問題的前一部分有什麼關係。但是,請注意組件可以分配。每個具有可分配組件的對象都可以將組件分配給不同的大小。同樣,儘管綁定過程中的虛擬參數必須具有匹配的特徵,虛擬參數的特徵是其形狀,但該形狀可以假定爲形狀。

+0

對於最後一部分,也許最好把它放在一個單獨的問題。關於主要問題,我的主要觀點是,當我使用擴展類型時,我想使用更接近實際函數的名稱(例如汽車類型而不是抽象類型)在僞參數中明確指出它。無論如何謝謝你的答案和參考! – ray

+0

我編輯的問題,並把最後一部分的問題http://stackoverflow.com/questions/19391094/is-it-possible-to-implement-an-abstract-variable-inside-a-type-in​​-fortran -2003 – ray

+0

實現綁定的具體過程(因此需要匹配僞參數名稱)可以始終轉發到另一個具有不同僞參數名稱的過程。 – IanH