当您通过通用接口或组合模块或通过类型绑定过程尝试重载子例程时,必须考虑到具有相同通用名称的任何过程必须具有可区分或不兼容的参数。
当使用无限多态实体时,您可以快速运行这个令人难以置信的教育示例中所示的问题:
INTERFACE foobar
SUBROUTINE foo(x)
INTEGER :: x
END SUBROUTINE foo
SUBROUTINE bar(x)
CLASS(*) :: x
END SUBROUTINE bar
END INTERFACE foobar
此处,foo(x)
与bar(x)
冲突,因为bar
的参数也可以是INTEGER
。
这个特殊问题可以使用新的子程序中的SELECT TYPE
构造来解决,该子程序取代了通用接口:
SUBROUTINE foobar(x)
CLASS(*) :: x
SELECT TYPE (x)
TYPE IS INTEGER
CALL foo(x)
CLASS default
CALL bar(x)
END SELECT
END SUBROUTINE foobar
然而,有时这样的结构会变得单调乏味。
是否还有其他方法可以在不使用SELECT TYPE
构造的情况下实现此类专业化?
答案 0 :(得分:0)
我认为SELECT TYPE构造的上述用法是实现此类要求的最佳方法。 根据Fortran 2018规范,上述程序中对INTERFACE foobar的使用不符合规范,因为整数x和class(*)x是TKR兼容的。编译器应为上述程序生成编译时错误。 我认为,除了用一个过程替换通用接口并使用选择类型构造来调用特定过程之外,没有更好的解决方法。
对通用声明的限制:
在以下情况下,可以区分两个伪参数: 它们都是数据对象或已知是函数,而且TKR彼此都不兼容。