首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载函数,在fortran 2003中,在抽象接口旁边返回指向基类型的指针?

重载函数,在fortran 2003中,在抽象接口旁边返回指向基类型的指针?
EN

Stack Overflow用户
提问于 2012-04-25 13:21:07
回答 1查看 643关注 0票数 0

我正在用Fortran2003编写一个链接列表结构。这个链表中的节点有两个不同的变体。该列表表示一个边的拓扑环,每个边被两个顶点有界,每个顶点连接到两个边。这些结构被声明为抽象的NODE_T类型,并由两个子类VN_T和EN_T实现。VN_T指向两个EN_Ts,反之亦然。由于列表在类型之间交替,指针存储在子类中。我的问题是添加类型绑定函数(方法?)对于名为NEXT()和PREV()的VN_T和EN_T,它们通过多态性进行正确的操作。VN_T%NEXT()应该跳过两个步骤,并获得下一个VN_T (由一个EN_T与起始的一个分开)。

我的类型/类定义如下:

代码语言:javascript
复制
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 TYPE

next/prev例程的实现都是相同的,next/prev和EN/VN的四个组合:

代码语言:javascript
复制
FUNCTION NEXTE(PENT)
CLASS(NODE_T), POINTER :: NEXTE
CLASS(EN_T) PENT
NEXTE => PENT%N%N
END FUNCTION

当我调用这些函数时:

代码语言:javascript
复制
CLASS(NODE_T), POINTER :: NODE1, NODE2
NODE2 => NODE1%NEXT()

然后我的编译器(Intel FORTRAN XE Composer 2011,即v12.0)抱怨消息

代码语言:javascript
复制
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.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-25 23:26:19

您可能需要更新编译器。正如在这个线程中所讨论的

代码语言:javascript
复制
http://software.intel.com/en-us/forums/showthread.php?t=78855

Fortran标准最初不允许直接调用抽象类型的类型绑定过程,您正在尝试这样做。然而,这个标准已经改变了,现在应该已经进入英特尔Fortran了。

另一种方法是将基类修改为:

代码语言:javascript
复制
TYPE :: NODE_T
  INTEGER :: IENT
  INTEGER :: ISIDE
  INTEGER :: ISUBTYPE
  INTEGER :: IPAD
CONTAINS
  PROCEDURE :: NEXT
  PROCEDURE :: PREV
  END TYPE NODE_T
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10316579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档