Constructor template -- bug?

Jonathan M Davis jmdavisProg at gmx.com
Wed Mar 2 00:07:55 PST 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 


More information about the Digitalmars-d-learn mailing list