On Tuesday, 8 July 2014 at 11:42:54 UTC, NoUseForAName wrote:
On Tuesday, 8 July 2014 at 11:16:52 UTC, Marc Schütz wrote:
Your example above doesn't work, because it would be interpreted as a redefinition of the struct. Instead, you can use a public alias to a private type:

// my_module.d:

private struct MyStructImpl {
   int x;
}

public alias MyStructPtr = MyStructImpl*;

void doSomething(MyStructPtr foo) {
   ...
}

// my_main_program.d:

MyStructPtr bar;    // OK
MyStructImpl foo;   // Error: my_module.MyStructImpl is private

Thanks, that is what I was looking for.

Addendum: You also need to protect the members of MyStructImpl, like so:

private struct MyStructImpl {
private:  // or `package:`
    int x;
}

Otherwise, they would still be accessible via dereferencing. (Don't worry, you _can_ access private members inside the module the struct is declared in, as access protection in D only applies across module boundaries.)

Reply via email to