3

我试图在模块内部创建一个抽象类型

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 应该与延迟函数的变量具有相同的名称。我找不到此信息,有人知道我为什么必须这样做,这是正确的吗?

编辑:我将问题的最后一部分移到了 这个新问题

4

1 回答 1

2

覆盖父类型中特定绑定的扩展中的特定绑定必须具有名称和特征匹配的虚拟参数,除非传递参数的类型(如果有)。这在 F2008 标准的第 4.5.7.3 节中进行了解释(F2003 中的类似词)。

因此,编译器抱怨是正确的。请记住,在引用过程时可以使用伪参数的名称,也可以在绑定的 PASS 属性中使用该名称。在这些上下文中,参数名称的不匹配没有意义。

关于你的最后一段,我不清楚你到底想要什么,或者这与问题的前一部分有何关系。但是,请注意,组件可以是可分配的。每个具有可分配组件的类型对象都可以将组件分配给不同的大小。类似地,虽然绑定过程中的伪参数必须具有匹配的特征,并且伪参数的一个特征是它的形状,但该形状可以被假定为形状。

于 2013-10-15T20:46:41.527 回答