www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Compiler doesn't see the inherited opApply in this example

reply Mike L. <sgtmuffles myrealbox.com> writes:
Hello, can anybody explain why the following code compiles with -version=works
but not without?

module test;

import std.stdio;

abstract class Parent
{
	int opApply(int delegate(ref int) dg)
	{
		int fakeDelegate(ref uint fake, ref int content)
			{ return dg(content); }
		return opApply(&fakeDelegate);
	}
	
	abstract int opApply(int delegate(ref uint, ref int) dg);
}

class Child : Parent
{
	override int opApply(int delegate(ref uint, ref int) dg)
	{
		uint index = 0;
		for(int content = 1; content < 6; content++)
		{
			int result = dg(index, content);
			if(result != 0)
				return result;
			index++;
		}
		return 0;
	}
}

void main()
{
	version(works)
		Parent child = new Child();
	else
		Child child = new Child();
	foreach(int content; child)
		writefln(content);
}

I'm making some collection classes and had the same problem. It seems like for
some reason the compiler can't match the index-free foreach() in the child, but
can in the parent. It obviously knows it's there, or else it wouldn't compile
because the index-free opApply would be abstract. Any thoughts?
Jul 03 2009
next sibling parent Mike L. <sgtmuffles myrealbox.com> writes:
Apparently I'm missing some basic concept  about how D does OO since I
recreated the problem with a simpler function. I'll re-examine things...
Jul 03 2009
prev sibling parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
On Fri, 03 Jul 2009 17:42:45 -0400, Mike L. <sgtmuffles myrealbox.com>  
wrote:

 module test;

 import std.stdio;

 abstract class Parent
 {
 	int opApply(int delegate(ref int) dg)
 	{
 		int fakeDelegate(ref uint fake, ref int content)
 			{ return dg(content); }
 		return opApply(&fakeDelegate);
 	}
 	
 	abstract int opApply(int delegate(ref uint, ref int) dg);
 }

 class Child : Parent
 {
/* add this line (see http://www.digitalmars.com/d/2.0/function.html#function-inheritance) */ alias Parent.opApply opApply;
 	override int opApply(int delegate(ref uint, ref int) dg)
 	{
 		uint index = 0;
 		for(int content = 1; content < 6; content++)
 		{
 			int result = dg(index, content);
 			if(result != 0)
 				return result;
 			index++;
 		}
 		return 0;
 	}
 }

 void main()
 {
 	version(works)
 		Parent child = new Child();
 	else
 		Child child = new Child();
 	foreach(int content; child)
 		writefln(content);
 }
Jul 07 2009