SELECT TYPE构造中的多态性分配

时间:2014-10-09 17:19:23

标签: compiler-errors polymorphism fortran allocation fortran2003

我正在尝试定义一个子程序,它分配不同类型的数组。以下是代码的简化版本:

subroutine Allocation1(Vec)
    class(*), allocatable, intent(out)      :: Vec(:)

    select type(Vec)
    type is(real(8))
        allocate(Vec(10)); Vec = 0.D0
    type is(complex(8))
        allocate(Vec(10)); Vec = (0.D0,0.D0)
    type is(integer)
        allocate(Vec(10)); Vec = 0
    endselect
endsubroutine Allocation1

但是我收到了三条我不理解的错误消息:

error #8306: Associate name defined in ASSOCIATE or SELECT TYPE statements doesn't have ALLOCATABLE or POINTER attribute   [VEC]

正如您所看到的,VEC是一个可分配的数组,所以我认为这个错误没有意义。这是什么意思,我该如何做到这一点?

我正在使用IVF XE 14.0.1.139。

2 个答案:

答案 0 :(得分:2)

看起来像编译器错误,适用于Gfortran和Solaris Studio。我建议您联系英特尔官方支持。

正如IanH指出的那样,其他编译器可能会编译错误。无论如何,无论是否符合标准,该过程仍然是无用的,因为要使select类型工作,变量仍然必须已经分配,​​因为过程的实际参数必须是多态的。你不能只在那里传递real, allocatable

答案 1 :(得分:0)

没有分配具有intent(out)属性的变量,因此Vec将没有类型,并且SELECT TYPE(VEC)是不可定义的。