www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Constructor template -- bug?

reply Bekenn <leaveme alone.com> writes:
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?
Mar 01 2011
next sibling parent Jonathan M Davis <jmdavisProg gmx.com> writes:
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
Mar 01 2011
prev sibling next sibling parent reply Jonathan M Davis <jmdavisProg gmx.com> writes:
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
Mar 01 2011
next sibling parent reply Jacob Carlborg <doob me.com> writes:
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
Mar 01 2011
parent Jacob Carlborg <doob me.com> writes:
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 =




 		{
 		
 			super(message, file, line, next);
 		
 		}
 		
 		this(string file = __FILE__, size_t line = __LINE__)(string




 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
Mar 02 2011
prev sibling parent Bekenn <leaveme alone.com> writes:
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...
Mar 02 2011
prev sibling parent Jonathan M Davis <jmdavisProg gmx.com> writes:
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 = 




 		{
 		
 			super(message, file, line, next);
 		
 		}
 		
 		this(string file = __FILE__, size_t line = __LINE__)(string 




 
 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
Mar 02 2011