Re: Why getting private member fails using getMember trait in a template?

2015-09-30 Thread Atila Neves via Digitalmars-d-learn
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


Re: Why getting private member fails using getMember trait in a template?

2015-09-30 Thread Marc Schütz via Digitalmars-d-learn
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.


Re: Why getting private member fails using getMember trait in a template?

2015-09-29 Thread Alexandru Ermicioi via Digitalmars-d-learn
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?


Why getting private member fails using getMember trait in a template?

2015-09-26 Thread Alexandru Ermicioi via Digitalmars-d-learn

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")))