Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
January 30, 2010 Should this work? | ||||
---|---|---|---|---|
| ||||
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 ---------------------------------------------------------------------- |
January 30, 2010 Re: Should this work? | ||||
---|---|---|---|---|
| ||||
Posted in reply to bobef | 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)".
|
January 30, 2010 Re: Should this work? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jacob Carlborg | 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.
|
January 30, 2010 Re: Should this work? | ||||
---|---|---|---|---|
| ||||
Posted in reply to bobef | 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.
|
January 30, 2010 Re: Should this work? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jacob Carlborg | 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 :)
|
Copyright © 1999-2021 by the D Language Foundation