Generics Fortran命名运算符

Generics Fortran命名运算符,generics,fortran,operator-overloading,intel-fortran,named,Generics,Fortran,Operator Overloading,Intel Fortran,Named,我编写了一个派生类型,并为其定义了一个命名运算符,如下所示: module ModuleNamedOperator implicit none type TCoords contains procedure :: TCoordsFM generic,public :: operator(.fm.) => TCoordsFM end type contains type(TCoords) function TCoordsFM(self,

我编写了一个派生类型,并为其定义了一个命名运算符,如下所示:

module ModuleNamedOperator
  implicit none
  type TCoords
    contains
      procedure :: TCoordsFM
      generic,public :: operator(.fm.) => TCoordsFM
  end type
  contains
    type(TCoords) function TCoordsFM(self,IVal) result(this)
      class(TCoords),intent(in) :: self
      integer(4),intent(in) :: IVal
      this=self
      write(*,'(I0)') "IVal:",IVal
    end function TCoordsFM
end module ModuleNamedOperator
当我尝试在以下代码中使用它时,奇怪的事情发生了:

program test
  use ModuleNamedOperator
  implicit none
  type(TCoords) :: a
  integer(4) :: i
  i=1
  a=a .fm. 1              ! Case 1, valid
  a=a .fm. i              ! Case 2, valid
  a=a .fm. 1 .fm. i       ! Case 3, invalid
  a=a .fm. i .fm. 1       ! Case 4, valid
  a=a .fm. 1 .fm. 1       ! Case 5, valid
  a=a .fm. i .fm. i       ! Case 6, invalid
end program test
在案例3和案例6中,代码无效。似乎运算符.fm的第二个参数是。是变量或命名常量,则会发生错误。那么这些案子是怎么回事?还有出路吗?如果重要的话,编译器是ifort_2013_sp1.3.174。 编译器给出以下错误消息:

TestNamedOperator.f90(25): error #6866: Dotted string neither a defined operator nor a structure component   [FM]
  a=a .fm. 1 .fm. i
--------------^
TestNamedOperator.f90(28): error #6866: Dotted string neither a defined operator nor a structure component   [FM]
  a=a .fm. i .fm. i
--------------^
TestNamedOperator.f90(25): error #6303: The assignment operation or the binary expression operation is invalid for the data types of the two operands.
  a=a .fm. 1 .fm. i
-------------^
TestNamedOperator.f90(28): error #6303: The assignment operation or the binary expression operation is invalid for the data types of the two operands.
  a=a .fm. i .fm. i
-------------^
compilation aborted for TestNamedOperator.f90 (code 1)

我认为您遇到了一个
ifort
编译器错误,请参阅。当将
write
语句更改为
write(*,'(A,I0))“IVal:,IVal
时,您的代码可以使用
gfortran
很好地编译

对于
ifort
,显式调用函数有助于:

program test
  use ModuleNamedOperator
  implicit none
  type(TCoords) :: a
  integer(4) :: i
  i=1
  a=a .fm. 1              ! Case 1, valid
  a=a .fm. i              ! Case 2, valid
  a=TCoordsFM((a .fm. 1), i)      ! Case 3, valid
  a=TCoordsFM((a .fm. i), 1)      ! Case 4, valid
  a=TCoordsFM((a .fm. 1), 1)      ! Case 5, valid
  a=TCoordsFM((a .fm. i), i)      ! Case 6, valid
end program test

如果你的意思是
1
,那么这不是一个命名常量,而是一个文字常量。为什么看起来像?你收到消息了吗?@Vladimir F.我已经添加了消息。还有一件事。如果我重载一个内在操作符而不是定义一个命名操作符,那么一切都正常。对于exmaple,如果我声明
generic,public::operator(>)=>TCoordsFM
而不是
generic,public::operator(.fm.)=>TCoordsFM
,那么像
a=a>I>1
这样的代码就可以了。您可以尝试添加括号来引导编译器按照执行顺序运行。。。在我看来,它似乎是在尝试评估
(i.fm.1)
,而这并没有定义。