Thread overview
Constructor template -- bug?
Mar 02, 2011
Bekenn
Mar 02, 2011
Jonathan M Davis
Mar 02, 2011
Jonathan M Davis
Mar 02, 2011
Jacob Carlborg
Mar 02, 2011
Jonathan M Davis
Mar 02, 2011
Jacob Carlborg
Mar 02, 2011
Bekenn
March 02, 2011
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
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
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
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
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
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
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