在问题Fortran derived type constructor defined though C function之后,我找到了这个非工作的例子,gfortran 4.9:
module my_module
use iso_c_binding
type, bind(c) :: my_double
real(c_double) :: x
real(c_double) :: y
end type my_double
interface my_double
procedure my_module_fortran_new_my_double
end interface
interface
type(my_double) function my_module_fortran_new_my_double (v) bind ( c )
use iso_c_binding
import :: my_double
real (c_double), intent(in) :: v
end function my_module_fortran_new_my_double
end interface
end module my_module
program main
use my_module
type(my_double) x
x = my_double(12)
end program main
按照上一个问题Fortran derived type constructor defined though C function,模块定义正常。但是,我的编译器无法识别定义的构造函数。
这是编译器输出:
$ gfortran -std=f2008 test.f90 -o test.o -c
test.f90:22.6:
x = my_double(12)
1
Error: No initializer for component 'y' given in the structure constructor at (1)!
这似乎不考虑我使用的定义构造函数。有人能帮助我理解我做错了吗(再次)?
答案 0 :(得分:3)
要匹配的特定构造函数
my_double(12)
必须有一个带接口的程序
type(my_double) function something(i, ...) ...
integer ... :: i
..., optional, ... :: ...
end function
因为给定的单一组件来源是integer
类型。
提供的唯一非默认特定构造函数是具有一个real(c_double)
类型的非可选组件源的构造函数。
要解决,有两种方法:
对于后者:
x = my_double(12._c_double) ! c_double from intrinsic iso_c_binding
值得注意的是为什么会出现这个问题。你可能会高兴地尝试
x = my_double(12,13) ! Using the normal constructor
x = my_double(12) ! Using the normal constructor if default
! initialization applies for component y
与隐含的构造函数一样,源项(遵循内在赋值的规则)转换为组件本身的类型/参数。这种转换不适用于解决泛型的问题。