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