【发布时间】:2020-12-19 17:41:53
【问题描述】:
我的 IDE 是:Code::Blocks 20.03 (MinGW 9.2.0)
这是我的简单代码:
module mod_kompleks
use, intrinsic :: iso_c_binding, only : rp => c_double
implicit none
type, public :: kom_bro
private
real(rp) :: dio_rea
real(rp) :: dio_img
contains
procedure, private :: kom_bro_sab ! 16 line
generic, public :: operator(+) => kom_bro_sab ! 18 line
end type kom_bro
interface kom_bro
module procedure :: kom_bro_set
end interface kom_bro
contains
! procedure - kom_bro_set
type(kom_bro) function kom_bro_set(rea_part, img_part) result(bro_c)
real, intent(in) :: rea_part, img_part
bro_c%dio_rea = rea_part
bro_c%dio_img = img_part
end function kom_bro_set
! procedure - kom_bro_sab
function kom_bro_sab(bro_a, bro_b) result(bro_c)
type(kom_bro), intent(in) :: bro_a
type(kom_bro), intent(in) :: bro_b
type(kom_bro) :: bro_c
bro_c%dio_rea = bro_a%dio_rea + bro_b%dio_rea
bro_c%dio_img = bro_a%dio_img + bro_b%dio_img
end function kom_bro_sab
end module mod_kompleks
program kompleksni_broj
use, non_intrinsic :: mod_kompleks
implicit none
integer :: i
type(kom_bro) :: broj_01(3)
type(kom_bro) :: broj_02(3)
type(kom_bro) :: broj_03(3)
do i = 1, 3
broj_01(i) = kom_bro(i + 2.2,i + 3.3)
broj_02(i) = kom_bro(i + 4.4,i + 5.5)
broj_03(i) = broj_01(i) + broj_02(i)
end do
end program kompleksni_broj
我打算定义一个看起来像复数但也允许将两个复数相加的算术运算的用户类型。由于在我的示例中我没有使用 Fortran 编程语言的经验,因此我遇到了编译器向我报告以下错误的问题:
|16|Error: Non-polymorphic passed-object dummy argument of 'kom_bro_sab'
|18|Error: Undefined specific binding 'kom_bro_sab' as target of GENERIC '+'
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
我在编程语言 Fortran 中的 OOP 知识不足以让我自己解决这个问题。 甚至可以定义这样的用户定义类型吗?
【问题讨论】:
-
您报告的错误并不是编译器会在上述代码中发现的唯一错误 - 您能否发布完整的错误列表,或者您实际编译的代码。
-
@IanBush 这是编译器显示的仅有的两个错误。
-
“过程,私有 :: kom_bro_sab !16 行”不是 Fortran。应该是什么?
-
@IanBush 现在是 Fortran。我不知道那部分是如何插入那里的。也许那部分在写问题时就到了。