Here's the explanatory reply.

At 08:17 AM 7/18/2007, strk wrote:
I don't get the template<class,class> syntax on line 122.

It's complicated.  The prior sentence may be an understatement.

A basic problem with getting an aspect class defined is the following tension:
- The owner class may not know the definition of the aspect at the point of definition, because the aspect must be able to change. - An owner class must have a full aspect class definition at its point of instantiation, because an instance of the aspect class is a member of the owner class. - The aspect class must have a full owner class definition at its point of instantiation, because it must be able to refer to the innards of the owner class.

This all boils down to a definition cycle of length two. (Self-reference is a cycle of length one.) There's an issue of infinite regress in definition that must be addressed. The solution, in this case, is to make the aspect parameter a template, where the final argument of said template must be instantiated with the owner class itself. Observe the specialization definition (around line 167 in my current copy):
        template< class T >
class Null_Aspect_1< T, ACT::Handle_Registry_Leader< T, Null_Aspect_1 > > This class defines the null aspect for class Handle_Registry_Leader (which, without an aspect, would be a template class with parameter T). The second parameter is a class, which class is the owner, instantiated with its template arguments, which include the null aspect.

Here's the magic. The use of Null_Aspect_1 in the specialization definition refers to the specialized class itself, not the non-specialized definition (which is in Aspect.hpp). Such a specialization creates a reference cycle of length two, just as required.

Eric




_______________________________________________
Gnash-dev mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/gnash-dev

Reply via email to