www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Should this work?

reply bobef <aasd.aasdasd.asd.ad.ad.as.d.a asdasdas.das.da.d.ad.sa.d> writes:
I get these errors DMD 1.055:

(void(char[] _param_0))()
bug.d(2): Error: expected 1 function arguments, not 0
(void(char[] _param_0))()
bug.d(15): Error: template instance bug.Foo!(a) error instantiating

//code----------------------------------------------------------------------------------------------

void Foo(alias X)() {
	pragma(msg,typeof(X).stringof);
}

class A {
	void a(char[]) {
	}

	void b() {
	}
}

void main() {

	Foo!(A.a)(); //doesnt work
	Foo!(A.b)(); //works

}

//end of code ----------------------------------------------------------------------
Jan 30 2010
parent reply Jacob Carlborg <doob me.com> writes:
On 1/30/10 14:06, bobef wrote:
 I get these errors DMD 1.055:

 (void(char[] _param_0))()
 bug.d(2): Error: expected 1 function arguments, not 0
 (void(char[] _param_0))()
 bug.d(15): Error: template instance bug.Foo!(a) error instantiating

 //code----------------------------------------------------------------------------------------------

 void Foo(alias X)() {
 	pragma(msg,typeof(X).stringof);
 }

 class A {
 	void a(char[]) {
 	}

 	void b() {
 	}
 }

 void main() {

 	Foo!(A.a)(); //doesnt work
 	Foo!(A.b)(); //works

 }

 //end of code ----------------------------------------------------------------------

Since "a" is a method and when you do "typeof(X)" it tries to call the method but since it takes one parameter it fails. "b" doesn't fail because it doesn't take any parameters. This is all because of the optional parentheses in function calls. Change to: "typeof(&X)".
Jan 30 2010
parent reply bobef <aasd.aasdasd.asd.ad.ad.as.d.a asdasdas.das.da.d.ad.sa.d> writes:
Jacob Carlborg Wrote:

 On 1/30/10 14:06, bobef wrote:
 I get these errors DMD 1.055:

 (void(char[] _param_0))()
 bug.d(2): Error: expected 1 function arguments, not 0
 (void(char[] _param_0))()
 bug.d(15): Error: template instance bug.Foo!(a) error instantiating

 //code----------------------------------------------------------------------------------------------

 void Foo(alias X)() {
 	pragma(msg,typeof(X).stringof);
 }

 class A {
 	void a(char[]) {
 	}

 	void b() {
 	}
 }

 void main() {

 	Foo!(A.a)(); //doesnt work
 	Foo!(A.b)(); //works

 }

 //end of code ----------------------------------------------------------------------

Since "a" is a method and when you do "typeof(X)" it tries to call the method but since it takes one parameter it fails. "b" doesn't fail because it doesn't take any parameters. This is all because of the optional parentheses in function calls. Change to: "typeof(&X)".

This is not true. You can't call neither A.a nor A.b because A is a class, not an instance of a class - there is no this. Maybe I should file a bug.
Jan 30 2010
parent reply Jacob Carlborg <doob me.com> writes:
On 1/30/10 14:47, bobef wrote:
 Jacob Carlborg Wrote:

 On 1/30/10 14:06, bobef wrote:
 I get these errors DMD 1.055:

 (void(char[] _param_0))()
 bug.d(2): Error: expected 1 function arguments, not 0
 (void(char[] _param_0))()
 bug.d(15): Error: template instance bug.Foo!(a) error instantiating

 //code----------------------------------------------------------------------------------------------

 void Foo(alias X)() {
 	pragma(msg,typeof(X).stringof);
 }

 class A {
 	void a(char[]) {
 	}

 	void b() {
 	}
 }

 void main() {

 	Foo!(A.a)(); //doesnt work
 	Foo!(A.b)(); //works

 }

 //end of code ----------------------------------------------------------------------

Since "a" is a method and when you do "typeof(X)" it tries to call the method but since it takes one parameter it fails. "b" doesn't fail because it doesn't take any parameters. This is all because of the optional parentheses in function calls. Change to: "typeof(&X)".

This is not true. You can't call neither A.a nor A.b because A is a class, not an instance of a class - there is no this. Maybe I should file a bug.

That's true, but you can still try to call it. void main () { A.a; } The above results in: Error: function A.a (char[]) does not match parameter types () Error: expected 1 function arguments, not 0 When I add the correct argument I get this result: Error: need 'this' to access member a Apparently it tries to match the arguments before it checks if "this" is available.
Jan 30 2010
parent bobef <aasd.aasdasd.asd.ad.ad.as.d.a asdasdas.das.da.d.ad.sa.d> writes:
Jacob Carlborg Wrote:

 On 1/30/10 14:47, bobef wrote:
 Jacob Carlborg Wrote:

 On 1/30/10 14:06, bobef wrote:
 I get these errors DMD 1.055:

 (void(char[] _param_0))()
 bug.d(2): Error: expected 1 function arguments, not 0
 (void(char[] _param_0))()
 bug.d(15): Error: template instance bug.Foo!(a) error instantiating

 //code----------------------------------------------------------------------------------------------

 void Foo(alias X)() {
 	pragma(msg,typeof(X).stringof);
 }

 class A {
 	void a(char[]) {
 	}

 	void b() {
 	}
 }

 void main() {

 	Foo!(A.a)(); //doesnt work
 	Foo!(A.b)(); //works

 }

 //end of code ----------------------------------------------------------------------

Since "a" is a method and when you do "typeof(X)" it tries to call the method but since it takes one parameter it fails. "b" doesn't fail because it doesn't take any parameters. This is all because of the optional parentheses in function calls. Change to: "typeof(&X)".

This is not true. You can't call neither A.a nor A.b because A is a class, not an instance of a class - there is no this. Maybe I should file a bug.

That's true, but you can still try to call it. void main () { A.a; } The above results in: Error: function A.a (char[]) does not match parameter types () Error: expected 1 function arguments, not 0 When I add the correct argument I get this result: Error: need 'this' to access member a Apparently it tries to match the arguments before it checks if "this" is available.

I am not sure it should try to call anything. If it did A.b would fail because of no this. So I guess nothing is actually called. Anyway it is a bug, I filed it :)
Jan 30 2010