Как указать одним методом два разных метода? - PullRequest
0 голосов
/ 13 апреля 2019

Я намерен указать с помощью одной и той же процедуры на две разные процедуры, но я не являюсь опытным программистом на Фортране, поэтому мне нужна помощь. Это мой простой код:

module types

  type :: type_one
    integer, private :: a1,a2
   contains
    procedure, public :: f_data => set_data_a1
    procedure, public :: f_data => cal_data_a2
  end type type_one

  private :: set_data_a1,cal_data_a2 

contains

integer function set_data_a1(this)
  class(type_one) :: this
  this%a1 = 2
end function set_data_a1

integer function calc_data_a2(this)
  class(type_one) :: this
  this%a2 = this%a1 + 3
end function calc_data_a2

end module types

program types_pro
  implicit none
  type(type_one) :: type_obj
  type_obj%f_data()
end program types_pro 

Я получил эту ошибку: `Уже есть процедура с именем привязки 'f_data' для производного типа 'type_one' |

Можно ли вызвать обе процедуры одновременно с type_obj%f_data()?

1 Ответ

2 голосов
/ 13 апреля 2019

Общее имя, такое как f_data, позволяет вызывать процедуры с разными входными сигнатурами (ранг, тип, вид и количество аргументов) с одним и тем же именем.Но, поскольку они имеют одинаковые сигнатуры аргументов, компилятор не может определить, какие из calc_data_a1 и calc_data_a2 выполнить, когда ваш код вызывает f_data.

, что приводит меня к вопросу оВы: Как вы ожидаете, что компилятор или код будет вести себя?Что вы хотите, чтобы компилятор делал? (ОК, это было два вопроса.)

Как правило, если вы хотите, чтобы компилятор выполнил две процедуры, вы должны сделать два вызова.Я мог бы, я полагаю, иметь одну процедуру, вызывающую другую, если вы хотите, чтобы обе выполнялись при ее вызове.

Если вы хотите заключить несколько функций в одно имя, они должны иметь разные входные сигнатуры, чтобыкомпилятор может определить, какой из них вызывать.

Очевидно, что моя более ранняя версия этого ответа не была достаточно явной:

Нет, нет способа написать свой код для выполнения двух разных процедур вответ на один звонок одному из них.(Если только один не вызывает другого.) Кроме того, нецелесообразно ожидать, что один указатель (процедура) будет указывать в любое время более чем на одну цель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...