Template Functions

3DLDF 1.1.5 is the first release that contains template functions,
namely
template <class C> C* create_new(), which is defined in
creatnew.web, and
template <class Real> Real get_second_largest(), which is defined
in gsltmplt.web.
See Dynamic Allocation of Shapes, and
Get Second Largest Real.

In order for template functions to be instantiated correctly, their
definitions must be available in each compilation unit where
specializations are declared or used. For non-template functions, it
suffices for their declarations to be available, and their
definitions are found at link-time. For this reason, the
definitions of create_new() and get_second_largest() are
in their own CWEB files, and are written to their own header files. The
latter are included in the other CWEB files that need them.

In addition, AM_CXXFLAGS = -frepo has been added to the file
Makefile.am in 3DLDF-1.1.5/CWEB/, so that the C++

compiler is called using the -frepo option.
The manual Using and Porting the GNU Compiler
Collection explains this as follows:

"Compile your template-using code with -frepo. The compiler will
generate files with the extension .rpo listing all of the template
instantiations used in the corresponding object files which could be
instantiated there; the link wrapper, collect2, will then update the
.rpo files to tell the compiler where to place those instantiations and
rebuild any affected object files. The link-time overhead is negligible
after the first pass, as the compiler will continue to place the
instantiations in the same files."1

The first time the executable 3dldf is built, the files that use
the template functions are recompiled one or more times, and the linker
is also called several times. This doesn't happen anymore, once the
.rpo files exist.

Template instantiation differs from compiler to compiler, so using
template functions will tend to make 3DLDF less portable. I am no
longer able to compile it on the DECalpha Personal Workstation I had
been using with the DEC C++
compiler.
See Ports, for more information.