Tempated class instantiation

Rory McGuire rjmcguire at gmail.com
Wed Dec 16 22:38:03 PST 2009


Mike L. <sgtmuffles at myrealbox.com> wrote:
 
> Simen kjaeraas Wrote:
> 
>> On Wed, 16 Dec 2009 07:25:39 +0100, Mike L. <sgtmuffles at myrealbox.com>  
>> wrote:
>> 
>> > I'm making a class template that only works with strings, so I thought  
>> > it'd be good to instantiate each template with char, wchar, and dchar  
>> > right in the template's module so that when it's compiled it'll be part  
>> > of the .obj file and won't have to compile it for every other project  
>> > that uses it. However, I get an error reproducible with this:
>> >
>> > module test;
>> >
>> > class A(T)
>> > {
>> >  version(broken)
>> >  {
>> >   class B
>> >   {
>> >    T blah() { return t; }
>> >   }
>> >  }
>> >  
>> >  T t;
>> > }
>> >
>> > mixin A!(int);
>> >
>> > int main()
>> > {
>> >  A!(int) a = new A!(int)();
>> >  return 0;
>> > }
>> >
>> > If what I want to do makes sense, how should I be doing it?
>> 
>> It makes sense. Seems to be another compiler bug, but I have
>> no good overview of which (might even be a new one).
>> This compiles and runs:
>> 
>> class A(T)
>> {
>>      version(broken)
>>      {
>>          class B
>>          {
>>              // Explicitly state which t we're talking about.
>>              T blah() { return this.outer.t; }
>>          }
>>      }
>> 
>>      T t;
>> }
>> 
>> mixin A!(int);
>> 
>> int main()
>> {
>>      A!(int) a = new A!(int)();
>>      return 0;
>> }
>> 
>> 
>> -- 
>> Simen
> 
> Thanks for the reply, that seems to be working for my project too, but the 
code gets really ugly really fast. Should I submit a bug report?
> 
> --Mike L.
> 

As grauzone said, you have to use an alias, or you could use a template. but the 
code above just does the same old templated class instantiation, you can leave 
out the mixin A!(int); line completely.
As far as I understand it a template is always evaluated at least once for each 
type T. So perhaps if you used it in the module that declares it the compiler 
would detect that it doesn't need to compile it again but I'm not convinced of 
that because the instance is in a different module.

-Rory



More information about the Digitalmars-d-learn mailing list