Generics Fortran通用接口包含伪参数为无限多态指针的过程的警告
我编写了一个包含三个模块过程的通用接口Generics Fortran通用接口包含伪参数为无限多态指针的过程的警告,generics,fortran,polymorphism,Generics,Fortran,Polymorphism,我编写了一个包含三个模块过程的通用接口 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
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:此特定过程的类型/等级/关键字签名与共享相同泛型名称的另一个特定过程匹配。[MESHR]
logical function MeshR(IVal)
---------------------^
Test.f90(13):警告#6738:此特定过程的类型/等级/关键字签名与共享相同泛型名称的另一个特定过程匹配。[MESHC]
logical function MeshC(IVal)
---------------------^
由于我们无法在函数或过程调用中将具体类型的数据(如实数或复数)传递给无限的polomorhpic指针,因此我不太明白编译器为什么给我这样的警告。然而,这些警告似乎不会在我的简单测试程序中引起任何问题。那么,有人能向我解释一下这些警告是怎么回事吗?在某些情况下,它们会导致严重的问题吗?非常感谢。(由于我忘记了F2008 12.5.2.5p2中的限制,因此对以下内容进行了材料编辑。)
<> P>一个关于泛型引用的适当的特定过程的选择规则不考虑指针和可分配的哑参数的当前限制,这些声明需要声明类型中的匹配。p>
在FORTRAN 2003中,规则甚至不考虑哑参数的可分配或指针性质。F2003中的具体过程选择基于实际参数的数量、名称和类型+种类+等级
因此,从特定过程选择的角度来看——由于无限多态对象与任何对象类型兼容,因此在确定应选择哪个特定过程作为参考时存在歧义,其中实际参数为实(4)或复杂(4) 当接口被扩展时(即当接口被声明时),编译器需要诊断这种模糊性,即使您的接口的实际使用并不模糊(需要意图的规则(中)要在多态参数的声明类型中匹配的指针或可分配参数的限制性也比它们需要的更大。如果它们在将来的修订版中被放宽,则肯定有可能出现不明确的引用。伪参数消歧的限制性比其他要求的限制性更大,这会导致向后的可能性兼容的语言将在将来更改。)根据f2003标准: 非多形实体仅与声明类型相同的实体类型兼容。非无限多态实体的多态实体与相同声明类型的实体或其任何扩展的类型兼容即使不受限制的多态实体不被视为具有声明的类型,但它与所有实体的类型兼容。如果一个实体与某一类型的实体类型兼容,则该实体被称为与该类型的实体类型兼容 因此无法解析接口(gfortran在该点返回错误)。所以一个无限多态可以有任何类型,包括real 在下面的代码中,您可以看到一个示例,其中
类(*),指针
变量具有实型
module mod1
implicit none
contains
function fun1(x)
real,target :: x
class(*), pointer ::fun1
fun1 => x
end function
function fun2(IVal)
class(*),pointer,intent(in) :: IVal
logical fun2
fun2=.false.
select type(IVal)
type is (real)
print*, 'type is real'
fun2 = .true.
end select
end function fun2
end module mod1
program main
use mod1
implicit none
real :: a
write(*,*) fun2(fun1(a))
end program main
返回:
type is real
T
有一件事我不明白,“即使一个无限多态实体不被认为具有声明的类型,它的类型与所有实体都兼容”,但是,我们仍然不能传递,例如,一个实变量或一个指向无限多态伪参数的实指针。如果我们使用“write(,)fun2(a)”而不是“write(,)fun2(fun1(a))”,甚至将“a”声明为实指针,编译器仍将给出错误消息。除意图规范外,该限制用于阻止被调用过程更改指针指向的对象的类型(这可能与实际参数的类型不一致)。如果伪参数不是指针,则可以将实变量或复变量传递给类(*)伪。