3DLDF 1.1.5 is the first release that contains template functions,
template <class C> C* create_new(), which is defined in
template <class Real> Real get_second_largest(), which is defined
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
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.
AM_CXXFLAGS = -frepo has been added to the file
3DLDF-1.1.5/CWEB/, so that the C++
compiler is called using the
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
.rpolisting all of the template instantiations used in the corresponding object files which could be instantiated there; the link wrapper,
collect2, will then update the
.rpofiles 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.