On 2013-01-22, 19:45, Minas Mina wrote:
I have this structure:
struct Scene
{
Array!Surface objects; // objects in the scene
Array!Light lights; // lights in the scene
/*private*/ BVHNode root; // root node of the BVH
tree
@disable this(); // disable the default constructor because space needs
to be reserved for objects and lights
this(size_t objectReserveSpace = 20, size_t lightReserveSpace = 3)
{
objects.reserve(objectReserveSpace);
lights.reserve(lightReserveSpace);
}
}
auto scene = Scene(); // error about @disabled constructor
Yes, the default constructor is @disabled BUT I am not using that one. I
want to use the other one - the custom constructor. I guess it signals
an error because it has those defaults parameters. But shouldn't the
compiler choose that one?
You *are* using the default one. The one without parameters *is* the
default constructor, and you are calling the constructor without
parameters.
One could argue that the compiler should choose the other constructor, and
even that having default constructors is reasonable. However, D has gone
the route of not having default constructors for structs. Instead,
structs are defined to be trivially constructible from T.init.
The workaround is to use static opCall:
struct Scene
{
Array!Surface objects;
Array!Light lights;
/*private*/ BVHNode root;
@disable this();
this(size_t objectReserveSpace = 20, size_t lightReserveSpace = 3)
{
objects.reserve(objectReserveSpace);
lights.reserve(lightReserveSpace);
}
static Scene opCall(size_t objectReserveSpace = 20, size_t
lightReserveSpace = 3)
{
return Scene(objectReserveSpace, lightReserveSpace);
}
}
--
Simen