Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
March 02, 2011 Constructor template -- bug? | ||||
---|---|---|---|---|
| ||||
Code: class MyException : Exception { this(string message, string file, size_t line, Throwable next = null) { super(message, file, line, next); } this(string file = __FILE__, size_t line = __LINE__)(string message, Throwable next = null) { this(message, file, line, next); } } void main() { throw new MyException("Bluh!"); } Error message: test.d(8): Error: template test.MyException.__ctor(string file = __FILE__,size_t line = __LINE__) conflicts with constructor test.MyException.this at test.d(3) If I remove the normal constructor and call super instead of this from the constructor template, then I get this slightly different error message: test.d(1): Error: constructor test.MyException.this conflicts with template test.MyException.__ctor(string file = __FILE__,uint line = __LINE__) at test.d(3) Is this a compiler bug, or am I Doing It Wrong? |
March 02, 2011 Re: Constructor template -- bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bekenn | On Tuesday 01 March 2011 22:18:49 Bekenn wrote: > Code: > > class MyException : Exception > { > this(string message, string file, size_t line, Throwable next = null) > { > super(message, file, line, next); > } > > this(string file = __FILE__, size_t line = __LINE__)(string message, > Throwable next = null) > { > this(message, file, line, next); > } > } > > void main() > { > throw new MyException("Bluh!"); > } > > Error message: > > test.d(8): Error: template test.MyException.__ctor(string file = > __FILE__,size_t line = __LINE__) conflicts with constructor > test.MyException.this at test.d(3) > > If I remove the normal constructor and call super instead of this from > the constructor template, then I get this slightly different error message: > > test.d(1): Error: constructor test.MyException.this conflicts with > template test.MyException.__ctor(string file = __FILE__,uint line = > __LINE__) at test.d(3) > > Is this a compiler bug, or am I Doing It Wrong? You cannot currently templatize class constructors: http://d.puremagic.com/issues/show_bug.cgi?id=435 And currently if one overload of a function is templatized, _all_ overloads of that function must templatized: http://d.puremagic.com/issues/show_bug.cgi?id=2972 http://d.puremagic.com/issues/show_bug.cgi?id=4749 - Jonathan M Davis |
March 02, 2011 Re: Constructor template -- bug? | ||||
---|---|---|---|---|
| ||||
On Tuesday 01 March 2011 23:43:27 Jonathan M Davis wrote:
> On Tuesday 01 March 2011 22:18:49 Bekenn wrote:
> > Code:
> > class MyException : Exception
> > {
> >
> > this(string message, string file, size_t line, Throwable next = null)
> > {
> >
> > super(message, file, line, next);
> >
> > }
> >
> > this(string file = __FILE__, size_t line = __LINE__)(string message,
> >
> > Throwable next = null)
> >
> > {
> >
> > this(message, file, line, next);
> >
> > }
> >
> > }
> >
> > void main()
> > {
> >
> > throw new MyException("Bluh!");
> >
> > }
> >
> > Error message:
> > test.d(8): Error: template test.MyException.__ctor(string file =
> >
> > __FILE__,size_t line = __LINE__) conflicts with constructor
> > test.MyException.this at test.d(3)
> >
> > If I remove the normal constructor and call super instead of this from
> >
> > the constructor template, then I get this slightly different error message:
> > test.d(1): Error: constructor test.MyException.this conflicts with
> >
> > template test.MyException.__ctor(string file = __FILE__,uint line =
> > __LINE__) at test.d(3)
> >
> > Is this a compiler bug, or am I Doing It Wrong?
>
> You cannot currently templatize class constructors:
>
> http://d.puremagic.com/issues/show_bug.cgi?id=435
>
> And currently if one overload of a function is templatized, _all_ overloads of that function must templatized:
>
> http://d.puremagic.com/issues/show_bug.cgi?id=2972 http://d.puremagic.com/issues/show_bug.cgi?id=4749
I should also point out that there is absolutely no need to use template for what you're trying to do. Just declare the constructor like so:
this(string message, string file = __FILE__, size_t line = __LINE__ Throwable next = null) { ... }
- Jonathan M Davis
|
March 02, 2011 Re: Constructor template -- bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | On 2011-03-02 08:47, Jonathan M Davis wrote: > On Tuesday 01 March 2011 23:43:27 Jonathan M Davis wrote: >> On Tuesday 01 March 2011 22:18:49 Bekenn wrote: >>> Code: >>> class MyException : Exception >>> { >>> >>> this(string message, string file, size_t line, Throwable next = null) >>> { >>> >>> super(message, file, line, next); >>> >>> } >>> >>> this(string file = __FILE__, size_t line = __LINE__)(string message, >>> >>> Throwable next = null) >>> >>> { >>> >>> this(message, file, line, next); >>> >>> } >>> >>> } >>> >>> void main() >>> { >>> >>> throw new MyException("Bluh!"); >>> >>> } >>> >>> Error message: >>> test.d(8): Error: template test.MyException.__ctor(string file = >>> >>> __FILE__,size_t line = __LINE__) conflicts with constructor >>> test.MyException.this at test.d(3) >>> >>> If I remove the normal constructor and call super instead of this from >>> >>> the constructor template, then I get this slightly different error message: >>> test.d(1): Error: constructor test.MyException.this conflicts with >>> >>> template test.MyException.__ctor(string file = __FILE__,uint line = >>> __LINE__) at test.d(3) >>> >>> Is this a compiler bug, or am I Doing It Wrong? >> >> You cannot currently templatize class constructors: >> >> http://d.puremagic.com/issues/show_bug.cgi?id=435 >> >> And currently if one overload of a function is templatized, _all_ overloads >> of that function must templatized: >> >> http://d.puremagic.com/issues/show_bug.cgi?id=2972 >> http://d.puremagic.com/issues/show_bug.cgi?id=4749 > > I should also point out that there is absolutely no need to use template for > what you're trying to do. Just declare the constructor like so: > > this(string message, string file = __FILE__, size_t line = __LINE__ Throwable > next = null) { ... } > > - Jonathan M Davis I guess the reason why he would do that is to catch the file and line number where the constructor is called. -- /Jacob Carlborg |
March 02, 2011 Re: Constructor template -- bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jacob Carlborg | On Tuesday 01 March 2011 23:52:38 Jacob Carlborg wrote: > On 2011-03-02 08:47, Jonathan M Davis wrote: > > On Tuesday 01 March 2011 23:43:27 Jonathan M Davis wrote: > >> On Tuesday 01 March 2011 22:18:49 Bekenn wrote: > >>> Code: > >>> class MyException : Exception > >>> { > >>> > >>> this(string message, string file, size_t line, Throwable next = null) > >>> { > >>> > >>> super(message, file, line, next); > >>> > >>> } > >>> > >>> this(string file = __FILE__, size_t line = __LINE__)(string message, > >>> > >>> Throwable next = null) > >>> > >>> { > >>> > >>> this(message, file, line, next); > >>> > >>> } > >>> > >>> } > >>> > >>> void main() > >>> { > >>> > >>> throw new MyException("Bluh!"); > >>> > >>> } > >>> > >>> Error message: > >>> test.d(8): Error: template test.MyException.__ctor(string file = > >>> > >>> __FILE__,size_t line = __LINE__) conflicts with constructor > >>> test.MyException.this at test.d(3) > >>> > >>> If I remove the normal constructor and call super instead of this from > >>> > >>> the constructor template, then I get this slightly different error message: > >>> test.d(1): Error: constructor test.MyException.this conflicts with > >>> > >>> template test.MyException.__ctor(string file = __FILE__,uint line = > >>> __LINE__) at test.d(3) > >>> > >>> Is this a compiler bug, or am I Doing It Wrong? > >> > >> You cannot currently templatize class constructors: > >> > >> http://d.puremagic.com/issues/show_bug.cgi?id=435 > >> > >> And currently if one overload of a function is templatized, _all_ overloads of that function must templatized: > >> > >> http://d.puremagic.com/issues/show_bug.cgi?id=2972 http://d.puremagic.com/issues/show_bug.cgi?id=4749 > > > > I should also point out that there is absolutely no need to use template for what you're trying to do. Just declare the constructor like so: > > > > this(string message, string file = __FILE__, size_t line = __LINE__ > > Throwable next = null) { ... } > > > > - Jonathan M Davis > > I guess the reason why he would do that is to catch the file and line number where the constructor is called. Except that that works with normal default arguments. I assume that he did not realize that. - Jonathan M Davis |
March 02, 2011 Re: Constructor template -- bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | On 3/1/2011 11:47 PM, Jonathan M Davis wrote:
>
> I should also point out that there is absolutely no need to use template for
> what you're trying to do. Just declare the constructor like so:
>
> this(string message, string file = __FILE__, size_t line = __LINE__ Throwable
> next = null) { ... }
You are absolutely right; silly me. I'd assumed that would pick up the file and line at the point of declaration...
|
March 02, 2011 Re: Constructor template -- bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | On 2011-03-02 09:07, Jonathan M Davis wrote: > On Tuesday 01 March 2011 23:52:38 Jacob Carlborg wrote: >> On 2011-03-02 08:47, Jonathan M Davis wrote: >>> On Tuesday 01 March 2011 23:43:27 Jonathan M Davis wrote: >>>> On Tuesday 01 March 2011 22:18:49 Bekenn wrote: >>>>> Code: >>>>> class MyException : Exception >>>>> { >>>>> >>>>> this(string message, string file, size_t line, Throwable next = > null) >>>>> { >>>>> >>>>> super(message, file, line, next); >>>>> >>>>> } >>>>> >>>>> this(string file = __FILE__, size_t line = __LINE__)(string > message, >>>>> >>>>> Throwable next = null) >>>>> >>>>> { >>>>> >>>>> this(message, file, line, next); >>>>> >>>>> } >>>>> >>>>> } >>>>> >>>>> void main() >>>>> { >>>>> >>>>> throw new MyException("Bluh!"); >>>>> >>>>> } >>>>> >>>>> Error message: >>>>> test.d(8): Error: template test.MyException.__ctor(string file = >>>>> >>>>> __FILE__,size_t line = __LINE__) conflicts with constructor >>>>> test.MyException.this at test.d(3) >>>>> >>>>> If I remove the normal constructor and call super instead of this from >>>>> >>>>> the constructor template, then I get this slightly different error message: >>>>> test.d(1): Error: constructor test.MyException.this conflicts with >>>>> >>>>> template test.MyException.__ctor(string file = __FILE__,uint line = >>>>> __LINE__) at test.d(3) >>>>> >>>>> Is this a compiler bug, or am I Doing It Wrong? >>>> >>>> You cannot currently templatize class constructors: >>>> >>>> http://d.puremagic.com/issues/show_bug.cgi?id=435 >>>> >>>> And currently if one overload of a function is templatized, _all_ >>>> overloads of that function must templatized: >>>> >>>> http://d.puremagic.com/issues/show_bug.cgi?id=2972 >>>> http://d.puremagic.com/issues/show_bug.cgi?id=4749 >>> >>> I should also point out that there is absolutely no need to use template >>> for what you're trying to do. Just declare the constructor like so: >>> >>> this(string message, string file = __FILE__, size_t line = __LINE__ >>> Throwable next = null) { ... } >>> >>> - Jonathan M Davis >> >> I guess the reason why he would do that is to catch the file and line >> number where the constructor is called. > > Except that that works with normal default arguments. I assume that he did not > realize that. > > - Jonathan M Davis Neither did I. -- /Jacob Carlborg |
Copyright © 1999-2021 by the D Language Foundation