On 01.09.2017 18:38, Sven Barth via fpc-devel wrote:
What if I do the initial specialization in a unit that does not know
about the helper? It can't just do speculative specialization once
both the specialized generic and the generic helper are used in the
same unit. And even if the compiler would postpone it till some method
of the specialized type is called things would get polluted once
multiple helpers lee type are allowed as every one of the generic
helpers in scope would need to be specialized for overload resolution.
So in short: no, I don't *want* this, but it's due to technical reasons.
> I guess it's because it does not know anymore that TFoo<Integer> is
in fact a closed generic type that was constructed from the open
geneneric type TFoo<T>?
The compiler can know rather easily that a type is a specialization,
but you need to keep in mind that helpers are also active for parent
types. So if you descend from a specialization the helpers of the
generic would need to be available as well.
What about explicitely specializing the generic helper?
generic TMyClass<T> = class;
generic TMyClassHelper<T> = class helper for TMyClass<T>;
...
TMyClassInt = specialize TMyClass<Integer>;
TMyClassIntHelper = specialize class helper(TMyClassHelper<Integer>)
for TMyClass<Integer>;
- or -
TMyClassIntHelper = specialize class helper(TMyClassHelper<Integer>)
for TMyClassInt;
In this case the compiler knows about the TMyClassIntHelper for
TMyClassInt(TMyClass<Integer>) and that it has to inherit from
TMyClassHelper<Integer>.
Ondrej
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel