Re: Constructor template -- bug?

2011-03-02 Thread Jonathan M Davis
On Wednesday 02 March 2011 00:14:55 Bekenn wrote:
 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...

I think that it works that way in C/C++, but it doesn't work that way in D. 
Actually, I had to point it out to Andrei at one point after he pointed out 
that 
it wouldn't work when I did it in some code he was reviewing. But I've tested 
it, and it definitely works.

- Jonathan M Davis


Re: Constructor template -- bug?

2011-03-02 Thread Jacob Carlborg

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


Re: Constructor template -- bug?

2011-03-01 Thread Jonathan M Davis
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


Re: Constructor template -- bug?

2011-03-01 Thread Jacob Carlborg

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