| Thread overview | ||||||
|---|---|---|---|---|---|---|
|
April 06, 2005 Templates + protection attributes problem | ||||
|---|---|---|---|---|
| ||||
Hello,
I'm having a problem using templates and the protection attributes for class members.
I can not access private declared methods from an other template class defined in the same module.
For example when I put this in the same module:
<code>
public class Foo(T) {
public this() {
// Works ok.
Bar!(T) bar = new Bar!(T)();
// Fails!? it's private, but in the same module!!
bar.doSomething();
}
}
public class Bar(T) {
public this() {
}
private void doSomething() {
}
}
</code>
The D-spec says the following:
<quote>
Private means that only members of the enclosing class can access the member, or members and functions in the same module as the enclosing class.
</quote>
I'm sure it has something to do with the templates, because the same thing without the templates works fine...
Does anyone know how to solve this?
thanks,
Kevin
| ||||
April 07, 2005 Re: Templates + protection attributes problem | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Kevin VR | It only works for the same module when you also declare it private within the module scope:
private member; <- only for inside this module
class Foo {
private member; <- only for inside Foo {}
}
What you probably want is the package protection, use the package keyword:
package void doSomething() {}
"Kevin VR" <azra@pandora.be> schreef in bericht news:d31ndi$amo$1@digitaldaemon.com...
> Hello,
>
> I'm having a problem using templates and the protection attributes for
> class members.
> I can not access private declared methods from an other template class
> defined in the same module.
>
> For example when I put this in the same module:
> <code>
> public class Foo(T) {
> public this() {
> // Works ok.
> Bar!(T) bar = new Bar!(T)();
>
> // Fails!? it's private, but in the same module!!
> bar.doSomething();
> }
> }
>
> public class Bar(T) {
> public this() {
> }
>
> private void doSomething() {
> }
> }
> </code>
>
> The D-spec says the following:
> <quote>
> Private means that only members of the enclosing class can access the
> member, or members and functions in the same module as the enclosing
> class.
> </quote>
>
> I'm sure it has something to do with the templates, because the same thing
> without the templates works fine...
> Does anyone know how to solve this?
>
> thanks,
> Kevin
| |||
April 07, 2005 Re: Templates + protection attributes problem | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Joey Peters | On Thu, 7 Apr 2005 13:02:33 +0200, Joey Peters <squirrel@nidhogg.com> wrote: > It only works for the same module when you also declare it private within > the module scope: > > private member; <- only for inside this module > class Foo { > private member; <- only for inside Foo {} > } Actually, no, both of those members above are accessable by another class/function etc in the same module. eg. import std.stdio; class A { private int aival; void foo(B b) { b.bival = 3; } } class B { private int bival; void foo(A a) { a.aival = 4; } } void main() { A a = new A(); B b = new B(); a.aival = 1; b.bival = 2; writefln(a.aival); writefln(b.bival); a.foo(b); b.foo(a); writefln(b.bival); writefln(a.aival); } > "Kevin VR" <azra@pandora.be> schreef in bericht > news:d31ndi$amo$1@digitaldaemon.com... >> Hello, >> >> I'm having a problem using templates and the protection attributes for >> class members. >> I can not access private declared methods from an other template class >> defined in the same module. >> >> For example when I put this in the same module: >> <code> >> public class Foo(T) { >> public this() { >> // Works ok. >> Bar!(T) bar = new Bar!(T)(); >> >> // Fails!? it's private, but in the same module!! >> bar.doSomething(); >> } >> } >> >> public class Bar(T) { >> public this() { >> } >> >> private void doSomething() { >> } >> } >> </code> >> >> The D-spec says the following: >> <quote> >> Private means that only members of the enclosing class can access the >> member, or members and functions in the same module as the enclosing >> class. >> </quote> >> >> I'm sure it has something to do with the templates, because the same thing >> without the templates works fine... >> Does anyone know how to solve this? Nope. It looks like a bug to me, here is another case demonstrating one that works, and one that doesn't. class Bar(Type) { this() { } private void doSomething() { } } class Baz { this() { } private void doSomething() { } } void main() { //this is ok Baz a = new Baz(); a.doSomething(); //this fails Bar!(int) b = new Bar!(int)(); b.doSomething(); } Regan | |||
April 07, 2005 Re: Templates + protection attributes problem | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Regan Heath | On Fri, 08 Apr 2005 00:27:37 +1200, Regan Heath <regan@netwin.co.nz> wrote:
> On Thu, 7 Apr 2005 13:02:33 +0200, Joey Peters <squirrel@nidhogg.com> wrote:
>> It only works for the same module when you also declare it private within
>> the module scope:
>>
>> private member; <- only for inside this module
>> class Foo {
>> private member; <- only for inside Foo {}
>> }
>
> Actually, no, both of those members above are accessable by another class/function etc in the same module. eg.
>
> import std.stdio;
>
> class A {
> private int aival;
> void foo(B b)
> {
> b.bival = 3;
> }
> }
>
> class B {
> private int bival;
> void foo(A a)
> {
> a.aival = 4;
> }
> }
>
> void main()
> {
> A a = new A();
> B b = new B();
>
> a.aival = 1;
> b.bival = 2;
> writefln(a.aival);
> writefln(b.bival);
>
> a.foo(b);
> b.foo(a);
>
> writefln(b.bival);
> writefln(a.aival);
> }
>
>> "Kevin VR" <azra@pandora.be> schreef in bericht
>> news:d31ndi$amo$1@digitaldaemon.com...
>>> Hello,
>>>
>>> I'm having a problem using templates and the protection attributes for
>>> class members.
>>> I can not access private declared methods from an other template class
>>> defined in the same module.
>>>
>>> For example when I put this in the same module:
>>> <code>
>>> public class Foo(T) {
>>> public this() {
>>> // Works ok.
>>> Bar!(T) bar = new Bar!(T)();
>>>
>>> // Fails!? it's private, but in the same module!!
>>> bar.doSomething();
>>> }
>>> }
>>>
>>> public class Bar(T) {
>>> public this() {
>>> }
>>>
>>> private void doSomething() {
>>> }
>>> }
>>> </code>
>>>
>>> The D-spec says the following:
>>> <quote>
>>> Private means that only members of the enclosing class can access the
>>> member, or members and functions in the same module as the enclosing
>>> class.
>>> </quote>
>>>
>>> I'm sure it has something to do with the templates, because the same thing
>>> without the templates works fine...
>>> Does anyone know how to solve this?
>
> Nope. It looks like a bug to me, here is another case demonstrating one that works, and one that doesn't.
>
> class Bar(Type)
> {
> this()
> {
> }
>
> private void doSomething()
> {
> }
> }
>
> class Baz
> {
> this()
> {
> }
>
> private void doSomething()
> {
> }
> }
>
> void main()
> {
> //this is ok
> Baz a = new Baz();
> a.doSomething();
>
> //this fails
> Bar!(int) b = new Bar!(int)();
> b.doSomething();
> }
I forgot to say, post this to the digitalmars.D.bugs NG pls :)
You can post my example or yours or both, up to you.
Regan
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply