Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
November 06, 2007 Help with template problem | ||||
---|---|---|---|---|
| ||||
The following is a simplified version of my program. It won't compile. The error lines are marked with comments. What's going on, and how do I fix it? Is this a bug in my code? Or in the compiler? Or what? /////////////////////////////////// module main; class A(uint N) { uint n = 0; this() { uint m = n; // Error: this for n needs to be type A not type main.A!(N).A // class main.A!(N).A member n is not accessible } } void doTest(uint N)() { auto a = new A!(N)(); // template instance main.A!(N) error instantiating } int main() { doTest!(1)(); doTest!(2)(); // template instance main.doTest!(2) error instantiating auto a = new A!(N)(); return 0; } |
November 07, 2007 Re: Help with template problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Janice Caron | Janice Caron wrote:
> int main()
> {
> doTest!(1)();
> doTest!(2)(); // template instance main.doTest!(2) error instantiating
>
> auto a = new A!(N)();
> return 0;
> }
-auto a = new A!(N)();
+auto a = new A!(123)();
Try that. :)
|
November 07, 2007 Re: Help with template problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to torhu | > -auto a = new A!(N)(); > +auto a = new A!(123)(); > > Try that. :) If you mean the one inside main(), you're right in that that shouldn't be there. That was a copy/paste error. But I don't need to rewrite the line, I can just delete it! The compile errors are still there. (I also took out the comments). So here's the newest version: ///////////////////////////////////////////////// module main; class A(uint N) { uint n = 0; this() { uint m = n; } } void doTest(uint N)() { auto a = new A!(N)(); } int main() { doTest!(1)(); doTest!(2)(); return 0; } ///////////////////////////////////////////////// The compile errors are: test.d(7): Error: this for n needs to be type A not type test.A!(N).A test.d(7): class test.A!(N).A member n is not accessible test.d(13): template instance test.A!(N) error instantiating test.d(19): template instance test.doTest!(2) error instantiating Replacing the N with 123 inside doTest() makes all the compilation errors go away, and it now compiles. But of course, now it doesn't do what it needs to do. At that point in the code, N is a compile time constant (being the tempate parameter), and so - unless I've misunderstood something - should be every bit as compilable as 123. |
November 07, 2007 Re: Help with template problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Janice Caron | Janice Caron wrote: > So here's the newest version: > > ///////////////////////////////////////////////// > module main; > > class A(uint N) > { > uint n = 0; > > this() > { > uint m = n; > } > } > > void doTest(uint N)() > { > auto a = new A!(N)(); > } > > int main() > { > doTest!(1)(); > doTest!(2)(); > > return 0; > } That compiles for me with DMD 1.023, 2.003, and 2.007, on Windows. -- E-mail address: matti.niemenmaa+news, domain is iki (DOT) fi |
November 07, 2007 Re: Help with template problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Janice Caron | Janice Caron wrote: > The compile errors are: > test.d(7): Error: this for n needs to be type A not type test.A!(N).A > test.d(7): class test.A!(N).A member n is not accessible I think it's a bug. I think the compiler is getting confused about the type of 'this' in the constructor. It seems to think you're referring to 'n' from a non-templated class, but of course 'this' in the constructor is a templated class type instance. Yet, when I add: writefln("%s", typeof(this).stringof); to the constructor it outputs "A". Lets assume this is a bug in stringof, or something. The type: "test.A!(N).A" Is, the type of the full templated form of the class/template shorthand you used: template A(uint N) { class A { uint n = 0; this() { uint m = n; } } } So, the type is built from the parts: <file>.<template_name>!(<params>).<template_item> But you probably already knew that. WORKAROUND: Adding "this." in front of "n" makes it compile :) Regan |
November 07, 2007 Re: Help with template problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Matti Niemenmaa | Matti Niemenmaa wrote:
> Janice Caron wrote:
>> So here's the newest version:
>>
>> /////////////////////////////////////////////////
>> module main;
>>
>> class A(uint N)
>> {
>> uint n = 0;
>>
>> this()
>> {
>> uint m = n;
>> }
>> }
>>
>> void doTest(uint N)()
>> {
>> auto a = new A!(N)();
>> }
>>
>> int main()
>> {
>> doTest!(1)();
>> doTest!(2)();
>>
>> return 0;
>> }
>
> That compiles for me with DMD 1.023, 2.003, and 2.007, on Windows.
But not for me with 2.005 on Windows.
Regan
|
November 07, 2007 Re: Help with template problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Regan Heath | Regan Heath wrote: > Matti Niemenmaa wrote: >> That compiles for me with DMD 1.023, 2.003, and 2.007, on Windows. > > But not for me with 2.005 on Windows. Then try upgrading first: it was probably a regression. -- E-mail address: matti.niemenmaa+news, domain is iki (DOT) fi |
November 07, 2007 Re: Help with template problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Matti Niemenmaa | Matti Niemenmaa wrote:
> Regan Heath wrote:
>> Matti Niemenmaa wrote:
>>> That compiles for me with DMD 1.023, 2.003, and 2.007, on Windows.
>> But not for me with 2.005 on Windows.
>
> Then try upgrading first: it was probably a regression.
You're right. It appears to be fixed in 2.007
Regan
|
November 07, 2007 Re: Help with template problem | ||||
---|---|---|---|---|
| ||||
Posted in reply to Regan Heath | On 11/7/07, Regan Heath <regan@netmail.co.nz> wrote:
> You're right. It appears to be fixed in 2.007
Oh well - forget I mentioned it then!
:-)
|
Copyright © 1999-2021 by the D Language Foundation