- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I get the error message "The name of the module procedure conflicts with a name in the encompassing scoping unit. [ADD_SUB]"
when compiling the source code below with a ifort 12.0.3 compiler on a ubuntu 12.04 64 bit platform
Any Ideas?
Thanks
Note: The specifity here is that the type-bound procedure is defined in a different modul than the typ it self. Although the module environment already specifies the interface, commenting the interface block in Module Header leads to an error message at compile time too.
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Module Header  Implicit None
  Type :: hello
     Integer :: a
     Integer :: b
     Integer :: sum
   contains
     procedure, pass :: add => add_sub
  End type hello
  Interface
     Subroutine add_sub(this)
       Import hello
       Implicit None
       class(hello) :: this
     End Subroutine add_sub
  End Interface
End Module
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Module Routines
  use Header
contains
  Subroutine add_sub(this)
    Implicit None
    class(hello), intent(inout) :: this
    this%sum=this%a+this%b
  End Subroutine
End Module
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Program Test
  use Header
  use Routines
  Implicit Non
  Type(hello) :: x
  x%a=1
  x%b=2
  call x%add()
  write(*,*) x
End Program TestLink Copied
		1 Reply
	
		
		
			
			
			
					
	
			- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
			
				
					
					
						If you want to use add_sub as defined in the module Routines as a specific implementation of the add
method, you will have to do that differently:
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Module Header
Implicit None
type, abstract :: hello
Integer :: a
Integer :: b
Integer :: sum
contains
procedure(add_sub), pass, deferred :: add
End type hello
Interface
Subroutine add_sub(this)
Import hello
Implicit None
class(hello) :: this
End Subroutine add_sub
End Interface
End Module
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Module Routines
use Header
type, extends(hello) :: hithere
contains
procedure, pass :: add => add_sub_hi
end type
contains
Subroutine add_sub_hi(this)
Implicit None
class(hithere), intent(inout) :: this
this%sum=this%a+this%b
End Subroutine
End Module
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Program Test
use Header
use Routines
Implicit None
Type(hithere) :: x
x%a=1
x%b=2
call x%add()
write(*,*) x
End Program Test
Note the changes:
- type hello is an abstract type now
- add is a deferred method
- I introduced a type hithere that is extended from type hello
While this may not be the simplest way, it has the features you
seem to want:
- An interface, rather than a particular implementation for "add"
- A second module that extends from the first
The code you posted does not connect the interface and the implementation,
so the compiler complained about names that get in each other's way.
Regards,
Arjen
		
		
	
	
	
method, you will have to do that differently:
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Module Header
Implicit None
type, abstract :: hello
Integer :: a
Integer :: b
Integer :: sum
contains
procedure(add_sub), pass, deferred :: add
End type hello
Interface
Subroutine add_sub(this)
Import hello
Implicit None
class(hello) :: this
End Subroutine add_sub
End Interface
End Module
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Module Routines
use Header
type, extends(hello) :: hithere
contains
procedure, pass :: add => add_sub_hi
end type
contains
Subroutine add_sub_hi(this)
Implicit None
class(hithere), intent(inout) :: this
this%sum=this%a+this%b
End Subroutine
End Module
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Program Test
use Header
use Routines
Implicit None
Type(hithere) :: x
x%a=1
x%b=2
call x%add()
write(*,*) x
End Program Test
Note the changes:
- type hello is an abstract type now
- add is a deferred method
- I introduced a type hithere that is extended from type hello
While this may not be the simplest way, it has the features you
seem to want:
- An interface, rather than a particular implementation for "add"
- A second module that extends from the first
The code you posted does not connect the interface and the implementation,
so the compiler complained about names that get in each other's way.
Regards,
Arjen
 
					
				
				
			
		
					
					Reply
					
						
	
		
				
				
				
					
						
					
				
					
				
				
				
				
			
			Topic Options
			
				
					
	
			
		
	- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page