Thread overview
Nested class constructors
Oct 14, 2005
Deewiant
Oct 15, 2005
John C
October 14, 2005
DMD 0.135, Windows XP Service Pack 2.

class A {
	class B {
		this() {}

		void foo() {
			new B();
		}
	}
}

-> "no 'this' for nested class B"

Am I missing something obvious, doing something wrong, or is this a bug?
October 15, 2005
"Deewiant" <deewiant.doesnotlike.spam@gmail.com> wrote in message news:dionmt$afm$1@digitaldaemon.com...
> DMD 0.135, Windows XP Service Pack 2.
>
> class A {
> class B {
> this() {}
>
> void foo() {
> new B();
> }
> }
> }
>
> -> "no 'this' for nested class B"
>
> Am I missing something obvious, doing something wrong, or is this a bug?

I'm not 100% sure, but I don't think non-static nested classes can have user-defined constructors. Try these:

1) Remove B's constructor. The compiler will add a default which you can
use.
2) change B's declaration to this: static class B. The only downside is you
won't be able to access A's members without maintaining a reference to an
instance of A. But you'll also be able to add your own constructors.


October 17, 2005
On Fri, 14 Oct 2005 18:52:09 +0200, Deewiant <deewiant.doesnotlike.spam@gmail.com> wrote:

> DMD 0.135, Windows XP Service Pack 2.
>
> class A {
> 	class B {
> 		this() {}
> 		
> 		void foo() {
> 			new B();
> 		}
> 	}
> }
>
> -> "no 'this' for nested class B"
>
> Am I missing something obvious, doing something wrong, or is this a bug?

Nonstatic nested classes contain secret pointer to enclosing class. Creating them is possible only in that enclosing class (and this pointer is passed secretly). In A.B.foo() you probably want to create B instance with secret pointer same as in current instance. You probably could create A.newB() like that:

class A {
...
 B newB() {
  return new B();
 }
...
}

and use it insted of "new B();". But I think what you're tried could be allowed to.
-- 
Dawid Ciężarkiewicz