Fortran OOP函数重载

时间:2014-11-12 12:10:05

标签: oop fortran overloading

我有两个函数,一个将分隔的字符串拆分为整数 数组,另一个是真正的数组。我试图超载。

Interface split
  Module Procedure split_to_int_unidim
  Module Procedure split_to_real_unidim
End Interface split

Function split_to_int_unidim (a, delim, pos) Result (b)
  Character(len=*), Intent (in) :: a, delim
  Character(len=*), Intent (in), Optional :: pos
  Integer, Allocatable :: b(:)
End Function

Function split_to_real_unidim (a, delim, pos) Result (b)
  Character(len=*), Intent (in) :: a, delim
  Character(len=*), Intent (in), Optional :: pos
  Real, Allocatable :: b(:)
End Function

我收到错误

gfortran -o build/lib/foul.o -c -ffree-form -g -J./build/lib lib/foul.f
lib/foul.f:22.41:

Module Procedure split_to_real_unidim
                                     1
Error: Ambiguous interfaces 'split_to_real_unidim' and 'split_to_int_unidim' 
in generic interface 'split' at (1)

我希望由于函数的返回属于不同的类型,我会没事的。 但是我似乎错误地看错了。有什么方法可以用同名来称呼它们吗?如果是这样,我需要做哪些修改?

1 个答案:

答案 0 :(得分:0)

使用这两个功能的一个问题是包括 一个额外的变量来解决参数中的ambiguation, 使他们的使用不直观。出现问题因为我们想要 将分隔的字符串拆分为整数或实数数组而不用 必须记住包含一个非直观的变量。

一个好的解决方案是将第一个输出元素b1包含为 输出参数。这个额外的论点是一致的 使用这两个功能,也可以解决ambiguation问题。

因此解决方案如下

Interface split
  Module Procedure split_to_int_unidim
  Module Procedure split_to_real_unidim
End Interface split

Function split_to_int_unidim (a, delim, b1, pos) Result (b)
  Character(len=*), Intent (in) :: a, delim
  Character(len=*), Intent (in), Optional :: pos
  Integer, Intent(out) :: b1
  Integer, Allocatable :: b(:)

  ...

  b1 = b(1)

End Function

Function split_to_real_unidim (a, delim, b1, pos) Result (b)
  Character(len=*), Intent (in) :: a, delim
  Character(len=*), Intent (in), Optional :: pos
  Real, Intent(out) :: b1
  Real, Allocatable :: b(:)

  ...

  b1 = b(1)

End Function