【发布时间】:2014-09-05 10:01:45
【问题描述】:
我在 Fortran90 中编码,即使我知道应该避免它,我也需要使用抽象类型。 现在我想定义一个函数,它可以在参数中采用抽象类型或派生类型。为此,我想创建两个函数的接口,但出现以下错误:
不明确的接口“initialize_abstract”和 通用接口中的“initialize_logic” 在 (1) 处“初始化”
代码如下:
type type1
contains
procedure, pass(transf) :: initialize_logic
procedure, pass(transf) :: initialize_abstract
end type
interface initialize
module procedure initialize_logic
module procedure initialize_abstract
end interface
function initialize_logic(element, element_logic)
type(type1), pointer :: element
type(type_logic), pointer :: element_logic
end function
function initialize_abstract(element, element_abstract)
type(type1), pointer :: element
class(type_abstract), pointer :: element_abstract
end function
type_abstract 是从 type_logic 扩展而来的。
我不知道如何摆脱这个消息错误,我真的需要能够使用抽象类型或扩展类型(这里:“logic_type”)来调用它,例如:
class(type_abstract), pointer :: element_abstract
type(type_logic), pointer :: element_logic
type(type1) :: e1, e2
call e1%initialize(element_abstract)
call e2%initialize(element_logic)
如果我只有一个初始化器,接受抽象类的参数,在使用扩展类型初始化时会出现以下错误:
错误:(1) 处“element_abstract”的实际参数必须具有相同的声明类型
有什么想法吗? 提前谢谢你
【问题讨论】:
-
您的
type1定义似乎不相关。你是不是想写点别的? -
只是我正在定义的类型,我希望使用函数 initialize_ 进行初始化...我稍微更改了代码,使其更加明确。感谢您的评论!
-
哦,我想我明白了,尽管我仍然不清楚你在做什么。编译器应该如何消除
initialize_logic和initialize_abstract的歧义?如果logic扩展abstract,那么调用initialize(element,element_something)可以同时表示initialize_logic和initialize_abstract,因为element_something既是type(logic)又是class(abstract)。一定会发生这种情况。 -
准确地说,您不是在 Fortran 90 中编码。类型绑定过程,例如您的
initialize_abstract,是在 2003 年标准中引入的。与abstract类型一样,尽管您经常使用 abstract 这个词,但您的代码并未使用它们。 -
这篇文章 -- ibm.com/developerworks/community/blogs/… -- 比我现在有时间更好地解释了(可能比我能力更好)如何为用户定义的类型创建构造函数。这个——pgroup.com/lit/articles/insider/v3n1a3.htm——也不错。
标签: generics interface fortran abstract fortran90