Требует ли реализация отложенной связанной процедуры 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 должен иметь то же имя переменной отложенной функции. Я не смог найти эту информацию, кто-нибудь знает, почему я должен это делать, и правильно ли это?

Изменить: я переместил последнюю часть вопроса в этот новый вопрос


person ray    schedule 15.10.2013    source источник


Ответы (1)


Конкретная привязка в расширении, которая переопределяет конкретную привязку в родительском типе, должна иметь фиктивные аргументы, совпадающие по имени и характеристикам, за исключением типа переданного аргумента, если таковой имеется. Это объясняется в стандарте F2008 в разделе 4.5.7.3 (аналогичные слова в F2003).

Поэтому компилятор правильно жалуется. Помните, что имя фиктивного аргумента может использоваться при ссылке на процедуру, а также может использоваться в атрибуте PASS для привязки. Несоответствие имен аргументов не имеет смысла в этих контекстах.

Что касается вашего последнего абзаца, мне не ясно, чего именно вы хотите, и как это относится к предыдущей части вопроса. Однако обратите внимание, что компоненты могут быть размещены. Каждый объект типа с выделяемым компонентом может иметь компонент, распределенный по другому размеру. Точно так же, хотя фиктивные аргументы в связанных процедурах должны иметь совпадающие характеристики, а характеристикой фиктивного аргумента является его форма, эта форма может быть принята за форму.

person IanH    schedule 15.10.2013
comment
Для последней части, возможно, лучше поместить ее в отдельный вопрос. Что касается основного вопроса, моя главная мысль заключается в том, что, поскольку я использую расширенный тип, я хотел бы сделать его явным в фиктивном аргументе, используя имя, более близкое к фактической функции (например, тип автомобиля вместо абстрактного типа). В любом случае спасибо за ответ и ссылку! - person ray; 16.10.2013
comment
Я отредактировал вопрос и поместил последнюю часть в вопрос stackoverflow.com/questions/19391094/ - person ray; 16.10.2013
comment
Конкретная процедура, которая реализует привязку (и, следовательно, имеет требование для сопоставления имен фиктивных аргументов), всегда может переадресовать другую процедуру с другим именем фиктивного аргумента. - person IanH; 16.10.2013