【发布时间】:2015-03-06 20:31:03
【问题描述】:
我编写了一个派生类型并为它定义了一个命名运算符,如下所示:
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)
【问题讨论】:
-
如果你的意思是
1,那么这不是一个命名常量,而是一个literal常量。 -
为什么会这样?你有收到任何消息吗?
-
@Vladimir F. 我已添加消息。
-
还有一件事。如果我重载一个内在运算符而不是定义一个命名运算符,那么一切都很好。例如,如果我声明
generic,public :: operator(>) => TCoordsFM而不是generic,public :: operator(.fm.) => TCoordsFM,那么a=a>i>1之类的代码就可以了 -
您可以尝试添加括号以引导编译器执行执行顺序...在我看来,它似乎正在尝试评估未定义的
(i .fm. 1)。
标签: generics fortran operator-overloading intel-fortran named