gpt4 book ai didi

generics - Fortran 泛型接口(interface)的警告,其中包含虚拟参数是无限多态指针的过程

转载 作者:行者123 更新时间:2023-12-01 23:50:45 25 4
gpt4 key购买 nike

我写了一个包含三个模块过程的通用接口(interface)

module MTest
implicit none
interface Mesh
module procedure :: MeshG,MeshR,Meshc
end interface Mesh
contains
logical function MeshR(IVal)
real(4),intent(in) :: IVal
MeshR=.true.
end function MeshR

logical function MeshC(IVal)
complex(4),intent(in) :: IVal
MeshC=.true.
end function MeshC

logical function MeshG(IVal)
class(*),pointer,intent(in) :: IVal
MeshG=.false.
end function MeshG
end module MTest

program main
use MTest
implicit none
real(4) :: a
write(*,*) Mesh(a)
end program main

当我用 ifort 编译它时,编译器给了我两个警告:

Test.f90(8):警告 #6738:此特定过程的类型/等级/关键字签名与共享相同通用名称的另一个特定过程相匹配。 [网格]
logical function MeshR(IVal)

---------------------^

Test.f90(13):警告 #6738:此特定过程的类型/等级/关键字签名与共享相同通用名称的另一个特定过程相匹配。 [MESHC]
logical function MeshC(IVal)

---------------------^

由于我们不能将具体类型的数据(例如实数或复数)传递给函数或过程调用中的无限多态指针,我不太明白为什么编译器会给我这样的警告。但是,这些警告似乎不会在我的简单测试程序中引起任何问题。那么,谁能向我解释这些警告是怎么回事,在某些情况下它们会引起任何严重的问题吗?非常感谢。

最佳答案

(因为忘记了 F2008 12.5.2.5p2 的限制,所以对以下内容进行了 Material 编辑。)

为泛型引用选择适当的特定过程的规则不考虑当前对需要声明类型匹配的指针和可分配伪参数的限制。

在 Fortran 2003 中,规则甚至不考虑虚拟参数的可分配或指针性质。 F2003中的具体程序选择是根据实际参数的个数、名称和类型+种类+等级。

因此,从特定过程选择的角度来看 - 因为无限多态对象与任何类型兼容,所以在确定应选择哪个特定过程作为实际参数为实数(4)或复数(4)的引用时存在歧义.

当接口(interface)被扩展时(即,接口(interface)被声明时),编译器需要诊断这种歧义,即使您对接口(interface)的实际使用不是模棱两可的。

(要求intent(in) 指针或可分配参数在声明类型中匹配多态参数的规则也比它们需要的更严格。如果在 future 的修订版中放宽它们,那么模棱两可的引用肯定是可能的。有 dummy参数消歧比其他要求更具限制性,这使得将来可能发生向后兼容的语言更改。)

关于generics - Fortran 泛型接口(interface)的警告,其中包含虚拟参数是无限多态指针的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26719709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com