www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - private template members

reply hunt0r <nomail nowhere.com> writes:
hi,

It seems that template members of a class are always public.

having a class like:
class Test
{
  private:
    int x;
    template test(T)
    {
	void test(T t) {x= 100;}
    }
  public:
    int getX() {return x;}
}

and calling:
Test t = new Test;
t.test();

prints 100 instead of saying that the member test is not accessable.
Is it not possible to get private template members with D?
May 01 2011
parent reply Dmitry Olshansky <dmitry.olsh gmail.com> writes:
On 01.05.2011 13:37, hunt0r wrote:
 hi,

 It seems that template members of a class are always public.

 having a class like:
 class Test
 {
    private:
      int x;
      template test(T)
      {
 	void test(T t) {x= 100;}
      }
    public:
      int getX() {return x;}
 }

 and calling:
 Test t = new Test;
 t.test();

 prints 100 instead of saying that the member test is not accessable.
 Is it not possible to get private template members with D?
It's not clear if you are calling it from separate module or from the same one. The access protection in D is module level, meaning you can access private members of the class in the same module. There are some known bugs about it: http://d.puremagic.com/issues/show_bug.cgi?id=3108 <http://d.puremagic.com/issues/show_bug.cgi?id=314> -- Dmitry Olshansky
May 01 2011
parent reply hunt0r <nomail nowhere.com> writes:
I was calling it from another module:
in file Test.d:
class Test
{
  private:
    int x;
    void testNonTemplate()
    {
    }
    template test()
    {
	void test() {x= 100;}
    }
  public:
    int getX() {return x;}
}
In file main.d:
import Test;
Test t = new Test;
t.test(); /*ok*/
t.testNonTemplate(); /*error*/
writeln(t.getX()); /* prints 100 */

I am using dmd 2.052
May 01 2011
parent reply Dmitry Olshansky <dmitry.olsh gmail.com> writes:
On 01.05.2011 16:38, hunt0r wrote:
 I was calling it from another module:
 in file Test.d:
 class Test
 {
    private:
      int x;
      void testNonTemplate()
      {
      }
      template test()
      {
 	void test() {x= 100;}
      }
    public:
      int getX() {return x;}
 }
 In file main.d:
 import Test;
 Test t = new Test;
 t.test(); /*ok*/
 t.testNonTemplate(); /*error*/
 writeln(t.getX()); /* prints 100 */

 I am using dmd 2.052
Then it's definitely a bug, it might be a duplicate report but it I suggest to file it anyway. It sill fails on my almost newest DMD from github. -- Dmitry Olshansky
May 01 2011
parent Mike Wey <mike-wey example.com> writes:
On 05/01/2011 03:15 PM, Dmitry Olshansky wrote:
 On 01.05.2011 16:38, hunt0r wrote:
 I was calling it from another module:
 in file Test.d:
 class Test
 {
 private:
 int x;
 void testNonTemplate()
 {
 }
 template test()
 {
 void test() {x= 100;}
 }
 public:
 int getX() {return x;}
 }
 In file main.d:
 import Test;
 Test t = new Test;
 t.test(); /*ok*/
 t.testNonTemplate(); /*error*/
 writeln(t.getX()); /* prints 100 */

 I am using dmd 2.052
Then it's definitely a bug, it might be a duplicate report but it I suggest to file it anyway. It sill fails on my almost newest DMD from github.
Probably this one: http://d.puremagic.com/issues/show_bug.cgi?id=2775 -- Mike Wey
May 01 2011