Using private constructor with std.experimental.allocater:make

earthfront via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun May 1 04:17:27 PDT 2016


Hello!

This code fails:
-------------------------
void main(){
  class A
    { int b; private this(int a){b=a;} }
    //{ int b; this(int a){b=a;} }

  import std.conv:emplace;
  import std.experimental.allocator.mallocator:Mallocator;
  import std.experimental.allocator:make;

  {
    auto ptr = make!A(Mallocator.instance, 42);
    assert (ptr.b == 42);
  }
}
---------------------------

with error message:
"/usr/include/dmd/phobos/std/conv.d(4115): Error: static assert  
"Don't know how to initialize an object of type A with arguments 
(int)"
/usr/include/dmd/phobos/std/experimental/allocator/package.d(456):        instantiated from here: emplace!(A, int)
./helloworld.d(25):        instantiated from here: make!(A, 
shared(Mallocator), int)"


If I make the constructor public, no problem.
It seems that emplace (specialized for classes) doesn't work if 
the class has a private constructor.


I added the following snippet to confirm:
----------------------
  {
    auto ptr = 
Mallocator.instance.allocate(__traits(classInstanceSize, A));
    auto aPtr = emplace(ptr,34);
    assert( aPtr.b == 34 );
  }
----------------------
And I get the same error message.


Google gave me:
http://forum.dlang.org/post/kot0t1$uls$1@digitalmars.com


That guy's ultimate fix was explicitly calling the class's __ctor 
method, instead of emplace. The __ctor method is undocumented, as 
far as I can tell.


Is there a better solution now? More widespread use of allocators 
will likely result in more of this problem.


More information about the Digitalmars-d-learn mailing list