www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Why getting private member fails using getMember trait in a template?

reply Alexandru Ermicioi <alexandru.ermicioi gmail.com> writes:
Suppose we have, two modules:

module testOne;

import std.traits;

template getMember(alias T, string member) {
     alias getMember = Identity!(__traits(getMember, T, member));
}

module app;
import testOne;
import std.traits;

class TestOne {

     private {
         int property;
     }

     public {
         int func() {
             return 0;
         }
     }
}


template getMember(alias T, string member) {
     alias getMember = Identity!(__traits(getMember, T, member));
}

void main() {
     pragma(msg, fullyQualifiedName!(__traits(getMember, TestOne, 
"property")));
     pragma(msg, fullyQualifiedName!(app.getMember!(TestOne, 
"property")));
     pragma(msg, fullyQualifiedName!(testOne.getMember!(TestOne, 
"property")));
}

First two statements execute and I get fully qualified name, 
while the third one fails with next error (dmd version v2.067.1):
src/testOne.d(6): Error: class app.TestOne member property is not 
accessible
src/app.d(26): Error: template instance 
testOne.getMember!(TestOne, "property") error instantiating
src/app.d(26):        while evaluating pragma(msg, 
fullyQualifiedName!(testOne.getMember!(TestOne, "property")))
Sep 26 2015
parent reply Alexandru Ermicioi <alexandru.ermicioi gmail.com> writes:
On Saturday, 26 September 2015 at 10:10:39 UTC, Alexandru 
Ermicioi wrote:
 Suppose we have, two modules:

 module testOne;

 [...]
So, is this behavior correct? If yes, then why?
Sep 29 2015
parent reply Atila Neves <atila.neves gmail.com> writes:
On Tuesday, 29 September 2015 at 09:40:41 UTC, Alexandru Ermicioi 
wrote:
 On Saturday, 26 September 2015 at 10:10:39 UTC, Alexandru 
 Ermicioi wrote:
 Suppose we have, two modules:

 module testOne;

 [...]
So, is this behavior correct? If yes, then why?
Yes, because private members aren't accessible from another module. If they need to be accessed, then they need to be public. Atila
Sep 30 2015
parent Marc =?UTF-8?B?U2Now7x0eg==?= <schuetzm gmx.net> writes:
On Wednesday, 30 September 2015 at 07:57:59 UTC, Atila Neves 
wrote:
 On Tuesday, 29 September 2015 at 09:40:41 UTC, Alexandru 
 Ermicioi wrote:
 On Saturday, 26 September 2015 at 10:10:39 UTC, Alexandru 
 Ermicioi wrote:
 Suppose we have, two modules:

 module testOne;

 [...]
So, is this behavior correct? If yes, then why?
Yes, because private members aren't accessible from another module. If they need to be accessed, then they need to be public. Atila
As a workaround, you should be able to determine the index of the member (i.e. the how-many-th member it is in your struct/class), and then use .tupleof to access it, which circumvents access checks.
Sep 30 2015