struct constructors and function parameters

Jonathan M Davis jmdavisProg at gmx.com
Tue Nov 9 16:21:49 PST 2010


On Tuesday, November 09, 2010 15:48:27 Adam Burton wrote:
> Hi,
> should the below work?
> 
> struct A
> {
>     public this(B b) {}
> }
> 
> struct B {}
> 
> void foo(A a) {}
> 
> void main()
> {
>     B b;
>     foo(b);     // Fails
> }
> 
> The constructor parameter doesn't need to be a struct, it could be an int.
> The workaround is to explicity call the constructor.

It should _not_ work. D does not support implicit conversions like that. You 
might be able to get it work with alias this, but that would be very different 
from expecting the compiler to cast a B to an A using A's constructor in order 
to call a function. C++ does that sort of thing all the time, but it can make it 
very hard to figure out which function overload is actually being called and why. 
It can be quite error prone. So, D is much pickier.

You should look at http://www.digitalmars.com/d/2.0/function.html - particularly 
the section on overloading. Generally, types must match exactly when calling a 
function. There is some leeway with some of the primitive types and if there is 
no ambiguity class objects can be implicitly cast to a base class in a function 
call, but there certainly isn't anything for structs, since they don't have 
inheritance.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list