Fortran运算符使用泛型函数重载

时间:2017-05-25 05:41:03

标签: fortran operator-overloading gfortran

我想使用函数的通用名称来重载'*'运算符,如下例所示:

interface scala
    module procedure :: scalapr,scalarp
end interface scala
interface operator(*)
   module procedure :: scala
end interface operator(*)

但是,用gfortran编译,我得到:

Error: Procedure 'scala' in intrinsic '*' operator at (1) is neither function nor subroutine

有转机吗?

1 个答案:

答案 0 :(得分:2)

您必须使用特定功能重载

interface scala
    module procedure :: scalapr,scalarp
end interface scala
interface operator(*)
   module procedure :: scalapr, scalarp
end interface operator(*)

泛型不是模块程序,因此它不能出现在module procedure

还有procedure,但这在这里没有帮助。它适用于不属于当前模块的程序。但无论如何,通用接口块中的函数必须是特定函数。

请参阅Fortran 2008 12.4.3.4 Generic interfaces

  

1通用接口块为每个接口块指定通用接口   接口块中的过程。 PROCEDURE语句列出   过程指针,外部过程,虚拟过程或模块   程序具有此通用接口。 ...

根据7.1.6:

5 A function defines the binary operation x1 op x2 if
  (2) either
     (a)  a generic interface (12.4.3.2) provides the function with a generic-spec of OPERATOR (op),
  or
     (b)  there is a generic binding (4.5.5) in the declared type 

所以上面的规则和约束

一样适用
  

C1207(R1206)程序名称应为非本质程序   有一个明确的界面。

通用名称不符合C1207。