I have a following class, where I need to store objects of type neuron_t and connection_t.
!> Class representing a general network
type :: net_t
private
character(:), allocatable :: net_type !< Type of the net
integer(kind=integer_4neuro) :: num_of_neurons !< Number of neurons in the net
character(:), allocatable :: training_method !< Used training method
class(neuron_t), allocatable :: neuron_arr(:) !< Array containing all neurons
integer(kind=integer_4neuro), allocatable :: input_neuron_arr(:) !< Array of input neuron indices
integer(kind=integer_4neuro), allocatable :: output_neuron_arr(:) !< Array of output neuron indices
class(connection_t), allocatable :: connection_arr(:) !< Array of all connections
contains
!> Prints information about the network to the standard output.
procedure :: print_info => print_info_impl
!> Saves the network instance to the Fortran binary file
procedure :: save_net_bin => save_net_bin_impl
end type net_t
interface net_t
!> Constructor of net_t class
!! Loads complete info about network from file
!! @param[in] filepath Path to the file with network configuration
!! @return Returns pointer to the new instance of the class net_t
module procedure :: new_net_1
end interface net_t
I tried to initialize the array like this
allocate(new_obj)
! Init object
do i=1,5
new_obj%neuron_arr(i) = mock_neuron_t()
end do
but I'm getting the following error:
new_obj%neuron_arr(i) = mock_neuron_t()
1
Error: Nonallocatable variable must not be polymorphic in intrinsic assignment at (1) - check that there is a matching specific subroutine for '=' operator
Do you know, what am I doing wrong? mock_neuron_t extends type neuron_t, so it should be ok.
EDIT:
Both neuron_t and connection_t classes are abstract, so I'm getting following error now after adding allocate(new_obj%neuron_arr):
allocate(new_obj%neuron_arr)
1
Error: Allocating new_obj of ABSTRACT base type at (1) requires a type-spec or source-expr
new_obj%neuron_arr(i) = mock_neuron_t()
1
Error: Nonallocatable variable must not be polymorphic in intrinsic assignment at (1) - check that there is a matching specific subroutine for '=' operator