Tempated class instantiation
Mike L.
sgtmuffles at myrealbox.com
Thu Dec 17 12:54:56 PST 2009
Rory McGuire Wrote:
> 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
>
So it sounds like my best bet is to just make a bogus alias. I guess I probably couldn't do something like mixin A!(int) and mixin A!(char), because each would create a class named A and there would be a naming conflict.
--Mike L.
More information about the Digitalmars-d-learn
mailing list