Self-referencing template parameters
Erik Rasmussen
i_am_erik at yahoo.com
Mon Mar 20 05:36:15 PST 2006
Oskar Linde wrote:
> The problem is that this line contains a recursive instantiation:
> abstract class Animal(T : Animal!(T))
>
> Animal!(T) has to be instantiated before the compiler knows how to what
> type it is.
>
> But if you place a static assert in a place outside what the compiler
> needs to deduce the type:
>
> class Animal(T) {
> this() {
> static assert(is(T : Animal));
> }
> public abstract T[] procreate(T mate);
> }
>
> Things work as they should.
>
>
> /Oskar
Thanks, but...
test.d
---
abstract class Animal(T)
{
this()
{
static assert(is(T : Animal));
}
public abstract T[] procreate(T mate);
}
class Monkey : Animal!(Monkey)
{
public Monkey[] procreate(Monkey mate)
{
return new Monkey[2];
}
}
int main(char[][] args)
{
new Monkey();
}
---
When I compile, I get:
test.d: variable test.Animal!(Monkey).Animal.this.this abstract cannot
be applied to variable
test.d:3: variable test.Animal!(Monkey).Animal.this.__result abstract
cannot be applied to variable
Now what? Line 3 is the "this()" line.
Erik
More information about the Digitalmars-d-learn
mailing list