我正在用Fortran2003编写一个链接列表结构。这个链表中的节点有两个不同的变体。该列表表示一个边的拓扑环,每个边被两个顶点有界,每个顶点连接到两个边。这些结构被声明为抽象的NODE_T类型,并由两个子类VN_T和EN_T实现。VN_T指向两个EN_Ts,反之亦然。由于列表在类型之间交替,指针存储在子类中。我的问题是添加类型绑定函数(方法?)对于名为NEXT()和PREV()的VN_T和EN_T,它们通过多态性进行正确的操作。VN_T%NEXT()应该跳过两个步骤,并获得下一个VN_T (由一个EN_T与起始的一个分开)。
我的类型/类定义如下:
TYPE, ABSTRACT :: NODE_T
INTEGER :: IENT
INTEGER :: ISIDE
INTEGER :: ISUBTYPE
INTEGER :: IPAD
CONTAINS
PROCEDURE(NEXTA), DEFERRED :: NEXT
PROCEDURE(PREVA), DEFERRED :: PREV
END TYPE NODE_T
ABSTRACT INTERFACE
FUNCTION NEXTA(PENT)
IMPORT NODE_T
CLASS(NODE_T), POINTER :: NEXTA
CLASS(NODE_T) :: PENT
END FUNCTION
FUNCTION PREVA(PENT)
IMPORT NODE_T
CLASS(NODE_T), POINTER :: PREVA
CLASS(NODE_T) :: PENT
END FUNCTION
END INTERFACE
TYPE, EXTENDS(NODE_T) :: VN_T
DOUBLE PRECISION DT
CLASS(EN_T), POINTER :: N
CLASS(EN_T), POINTER :: P
CONTAINS
PROCEDURE :: NEXT => NEXTV
PROCEDURE :: PREV => PREVV
END TYPE
TYPE, EXTENDS(NODE_T) :: EN_T
CLASS(VN_T), POINTER :: N
CLASS(VN_T), POINTER :: P
CONTAINS
PROCEDURE :: NEXT => NEXTE
PROCEDURE :: PREV => PREVE
END TYPEnext/prev例程的实现都是相同的,next/prev和EN/VN的四个组合:
FUNCTION NEXTE(PENT)
CLASS(NODE_T), POINTER :: NEXTE
CLASS(EN_T) PENT
NEXTE => PENT%N%N
END FUNCTION当我调用这些函数时:
CLASS(NODE_T), POINTER :: NODE1, NODE2
NODE2 => NODE1%NEXT()然后我的编译器(Intel FORTRAN XE Composer 2011,即v12.0)抱怨消息
error #8314: If the rightmost part-name is of abstract type, data-ref shall be polymorphic [NEXT]
NODE2 => NODE1%NEXT()
---------------------------^基于这个这份文件,它似乎表明它试图调用基类上的procdure,而不是选择一个子类实现(它应该能够基于右侧的NODE1的具体类型来实现,对吗?)
我对F2003的OOP特性很熟悉,所以我用JAVA制作了一个模型,并使我感到满意。有谁能说明这是F2003的OOP行为的差异,2)编译器的错误,还是只有我是braindead.
发布于 2012-04-25 23:26:19
您可能需要更新编译器。正如在这个线程中所讨论的
http://software.intel.com/en-us/forums/showthread.php?t=78855Fortran标准最初不允许直接调用抽象类型的类型绑定过程,您正在尝试这样做。然而,这个标准已经改变了,现在应该已经进入英特尔Fortran了。
另一种方法是将基类修改为:
TYPE :: NODE_T
INTEGER :: IENT
INTEGER :: ISIDE
INTEGER :: ISUBTYPE
INTEGER :: IPAD
CONTAINS
PROCEDURE :: NEXT
PROCEDURE :: PREV
END TYPE NODE_Thttps://stackoverflow.com/questions/10316579
复制相似问题