www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - property/opAddAssign problem

reply teo <teo.ubuntu.remove yahoo.com> writes:
Consider following:

class A
{
  int m;
  void opAddAssign(int n) { m += n; }
}

class B
{
  A a;
  this() { a = new A; }
  A Prop() { return a; }
}

void main()
{
  B b = new B;
  b.Prop += 3;
}

I get a compilation error (dmd v2.037):

test.d(17): Error: 'b.Prop' is not a scalar, it is a A()
test.d(17): Error: incompatible types for ((b.Prop) += (3)): 'A()' and 
'int'

Am I doing something wrong, or is this a known issue with opAddAssign and/
or properties?
Dec 29 2009
parent reply "Steven Schveighoffer" <schveiguy yahoo.com> writes:
On Tue, 29 Dec 2009 09:01:38 -0500, teo <teo.ubuntu.remove yahoo.com>  
wrote:

 Consider following:

 class A
 {
   int m;
   void opAddAssign(int n) { m += n; }
 }

 class B
 {
   A a;
   this() { a = new A; }
   A Prop() { return a; }
 }

 void main()
 {
   B b = new B;
   b.Prop += 3;
 }

 I get a compilation error (dmd v2.037):

 test.d(17): Error: 'b.Prop' is not a scalar, it is a A()
 test.d(17): Error: incompatible types for ((b.Prop) += (3)): 'A()' and
 'int'

 Am I doing something wrong, or is this a known issue with opAddAssign  
 and/
 or properties?
This is part of the issue with properties that will be fixed with the property annotation. try b.Prop() += 3; -Steve
Dec 29 2009
parent reply "Steven Schveighoffer" <schveiguy yahoo.com> writes:
On Tue, 29 Dec 2009 09:10:14 -0500, Steven Schveighoffer  
<schveiguy yahoo.com> wrote:

 On Tue, 29 Dec 2009 09:01:38 -0500, teo <teo.ubuntu.remove yahoo.com>  
 wrote:

 Consider following:

 class A
 {
   int m;
   void opAddAssign(int n) { m += n; }
 }

 class B
 {
   A a;
   this() { a = new A; }
   A Prop() { return a; }
 }

 void main()
 {
   B b = new B;
   b.Prop += 3;
 }

 I get a compilation error (dmd v2.037):

 test.d(17): Error: 'b.Prop' is not a scalar, it is a A()
 test.d(17): Error: incompatible types for ((b.Prop) += (3)): 'A()' and
 'int'

 Am I doing something wrong, or is this a known issue with opAddAssign  
 and/
 or properties?
This is part of the issue with properties that will be fixed with the property annotation. try b.Prop() += 3;
Eventually, marking Prop as a property should also work (haven't tested it, it may work now): property A Prop() { return a; } ... b.Prop += 3; // compiles -Steve
Dec 29 2009
parent reply teo <teo.ubuntu.remove yahoo.com> writes:
On Tue, 29 Dec 2009 09:12:15 -0500, Steven Schveighoffer wrote:

 On Tue, 29 Dec 2009 09:10:14 -0500, Steven Schveighoffer
 <schveiguy yahoo.com> wrote:
 
 On Tue, 29 Dec 2009 09:01:38 -0500, teo <teo.ubuntu.remove yahoo.com>
 wrote:

 Consider following:

 class A
 {
   int m;
   void opAddAssign(int n) { m += n; }
 }

 class B
 {
   A a;
   this() { a = new A; }
   A Prop() { return a; }
 }

 void main()
 {
   B b = new B;
   b.Prop += 3;
 }

 I get a compilation error (dmd v2.037):

 test.d(17): Error: 'b.Prop' is not a scalar, it is a A() test.d(17):
 Error: incompatible types for ((b.Prop) += (3)): 'A()' and 'int'

 Am I doing something wrong, or is this a known issue with opAddAssign
 and/
 or properties?
This is part of the issue with properties that will be fixed with the property annotation. try b.Prop() += 3;
Thanks. This trick works, but it looks a bit weird.
 
 Eventually, marking Prop as a  property should also work (haven't tested
 it, it may work now):
 
  property A Prop() { return a; }
 
 ...
 
 b.Prop += 3; // compiles
 
 -Steve
Unfortunately it doesn't: test.d(17): Error: 'b.Prop' is not a scalar, it is a property A() test.d(17): Error: incompatible types for ((b.Prop) += (3)): ' property A ()' and 'int'
Dec 29 2009
parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
On Tue, 29 Dec 2009 13:44:18 -0500, teo <teo.ubuntu.remove yahoo.com>  
wrote:

 On Tue, 29 Dec 2009 09:12:15 -0500, Steven Schveighoffer wrote:
 Eventually, marking Prop as a  property should also work (haven't tested
 it, it may work now):

  property A Prop() { return a; }

 ...

 b.Prop += 3; // compiles

 -Steve
Unfortunately it doesn't: test.d(17): Error: 'b.Prop' is not a scalar, it is a property A() test.d(17): Error: incompatible types for ((b.Prop) += (3)): ' property A ()' and 'int'
It will evenutally, probably within the next couple releases. -Steve
Dec 29 2009