Annotation of gcc/cp/templates.texi, revision 1.1

1.1     ! root        1: @node Templates
        !             2: @chapter The Template Implementation
        !             3: 
        !             4: @cindex templates
        !             5: @cindex function templates
        !             6: @cindex class templates
        !             7: @cindex parameterized types
        !             8: @cindex types, parameterized
        !             9: The C++ template@footnote{Class templates are also known as
        !            10: @dfn{parameterized types}.} facility, which effectively allows use of
        !            11: variables for types in declarations, is one of the newest features of
        !            12: the language.
        !            13: 
        !            14: @sc{gnu} C++ is one of the first compilers to implement many
        !            15: of the template facilities currently defined by the @sc{ansi} committee.
        !            16: 
        !            17: Nevertheless, the template implementation is not yet complete.  This
        !            18: chapter maps the current limitations of the @sc{gnu} C++ template
        !            19: implementation.
        !            20: 
        !            21: @menu
        !            22: * Template limitations:: Limitations for function and class templates
        !            23: * Function templates::   Limitations for function templates
        !            24: * Class templates::      Limitations for class templates
        !            25: * Template debugging::   Debugging information for templates
        !            26: @end menu
        !            27: 
        !            28: @node Template limitations
        !            29: @section Limitations for function and class templates
        !            30: 
        !            31: @cindex template limitations
        !            32: @cindex template bugs
        !            33: @cindex bugs, templates
        !            34: These limitations apply to any use of templates (function templates or
        !            35: class templates) with @sc{gnu} C++:
        !            36: 
        !            37: @table @emph
        !            38: @item Template definitions must be visible
        !            39: When you compile code with templates, the template definitions must come
        !            40: first (before the compiler needs to expand them), and template
        !            41: definitions you use must be visible in the current scope.
        !            42: @c FIXME! Is this a defined property of templates, rather than a
        !            43: @c temporary limitation?
        !            44: @c ANSWER: It's a limitation, but it's hard to say why it's a limitation
        !            45: @c to someone.  We need an infinite link-cycle, in one camp, to
        !            46: @c accomplish things so you don't need the template definitions around.
        !            47: 
        !            48: @cindex static data in template classes
        !            49: @cindex template classes, static data in
        !            50: @item Individual initializers needed for static data
        !            51: Templates for static data in template classes do not work.  @xref{Class
        !            52: templates,,Limitations for class templates}.
        !            53: @end table
        !            54: 
        !            55: @node Function templates
        !            56: @section Limitations for function templates
        !            57: 
        !            58: @cindex function template limitations
        !            59: Function templates are implemented for the most part.  The compiler can
        !            60: correctly determine template parameter values, and will delay
        !            61: instantiation of a function that uses templates until the requisite type
        !            62: information is available.
        !            63: 
        !            64: @noindent
        !            65: The following limitations remain: 
        !            66: 
        !            67: @itemize @bullet
        !            68: @cindex template vs declaration, functions
        !            69: @cindex declaration vs template, functions
        !            70: @cindex function declaration vs template
        !            71: @item
        !            72: Narrowed specification: function declarations should not prevent
        !            73: template expansion.  When you declare a function, @sc{gnu} C++
        !            74: interprets the declaration as an indication that you will provide a
        !            75: definition for that function.  Therefore, @sc{gnu} C++ does not use a
        !            76: template expansion if there is also an applicable declaration.  @sc{gnu}
        !            77: C++ only expands the template when there is no such declaration.
        !            78: 
        !            79: The specification in Bjarne Stroustrup's @cite{The C++ Programming
        !            80: Language, Second Edition} is narrower, and the @sc{gnu} C++
        !            81: implementation is now clearly incorrect.  With this new specification, a
        !            82: declaration that corresponds to an instantiation of a function template
        !            83: only affects whether conversions are needed to use that version of the
        !            84: function.  It should no longer prevent expansion of the template
        !            85: definition.
        !            86: 
        !            87: For example, this code fragment must be treated differently:
        !            88: 
        !            89: @smallexample
        !            90: template <class X> X min (X& x1, X& x2) @{ @dots{} @}
        !            91: int min (int, int);
        !            92: @dots{}
        !            93: int i; short s;
        !            94: min (i, s); // @r{should call} min(int,int)
        !            95:             // @r{derived from template}
        !            96: @dots{}
        !            97: @end smallexample
        !            98: 
        !            99: @item
        !           100: The compiler does not yet understand function signatures where types are
        !           101: nested within template parameters.  For example, a function like the
        !           102: following produces a syntax error on the closing @samp{)} of the
        !           103: definition of the function @code{f}:
        !           104: 
        !           105: @smallexample
        !           106: template <class T> class A @{ public: T x; class Y @{@}; @};
        !           107: template <class X> int f (A<X>::Y y) @{ @dots{} @}
        !           108: @end smallexample
        !           109: 
        !           110: @cindex @code{inline} and function templates
        !           111: @cindex function templates and @code{inline}
        !           112: @item
        !           113: If you declare an @code{inline} function using templates, the compiler
        !           114: can only inline the code @emph{after} the first time you use
        !           115: that function with whatever particular type signature the template
        !           116: was instantiated.
        !           117: 
        !           118: Removing this limitation is akin to supporting nested function
        !           119: definitions in @sc{gnu} C++; the limitation will probably remain until the
        !           120: more general problem of nested functions is solved.
        !           121: 
        !           122: @item
        !           123: All the @emph{method} templates (templates for member functions) for a
        !           124: class must be visible to the compiler when the class template is
        !           125: instantiated. 
        !           126: @end itemize
        !           127: 
        !           128: @node Class templates
        !           129: @section Limitations for class templates
        !           130: 
        !           131: @cindex class template limitations
        !           132: @ignore
        !           133: FIXME!!  Include a comprehensible version of this if someone can explain it.
        !           134:          (Queried Brendan and Raeburn w/full orig context, 26may1993---pesch)
        !           135:    - [RHP: I don't understand what the following fragment refers to.  If it's
        !           136:      the "BIG BUG" section in the original, why does it say "overriding class
        !           137:      declarations" here when the more detailed text refers to *function*
        !           138:      declarations?  Here's the fragment I don't understand:] 
        !           139:      there are problems with user-supplied overriding class declarations (see
        !           140:      below). 
        !           141: @end ignore
        !           142: 
        !           143: @itemize @bullet
        !           144: @ignore
        !           145: @cindex static data, not working in templates
        !           146: @item
        !           147: Templates for static data in template classes do not work.
        !           148: Currently, you must initialize each case of such data
        !           149: individually. 
        !           150: @c FIXME!! Brendan to see if still true.
        !           151: @c ANSWER: This section presumes that it's incorrect to have to
        !           152: @c initialize for each type you instantiate with.  It's not, it's the
        !           153: @c right way to do it.
        !           154: @end ignore
        !           155: 
        !           156: Unfortunately, individual initializations of this sort are likely to be
        !           157: considered errors eventually; since they're needed now, you might want to
        !           158: flag places where you use them with comments to mark the need for a
        !           159: future transition.
        !           160: 
        !           161: @cindex nested type results vs templates
        !           162: @item
        !           163: Member functions in template classes may not have results of nested
        !           164: type; @sc{gnu} C++ signals a syntax error on the attempt.  The following
        !           165: example illustrates this problem with an @code{enum} type @code{alph}:
        !           166: 
        !           167: @smallexample
        !           168: template <class T> class list @{
        !           169:   @dots{}
        !           170:   enum alph @{a,b,c@};
        !           171:   alph bar();
        !           172:   @dots{}
        !           173: @};
        !           174: 
        !           175: template <class T>
        !           176: list<int>::alph list<int>::bar()  // @i{Syntax error here}
        !           177: @{
        !           178: @dots{}
        !           179: @}
        !           180: @end smallexample
        !           181: 
        !           182: @cindex preprocessor conditionals in templates
        !           183: @cindex conditionals (preprocessor) in templates
        !           184: @item
        !           185: A parsing bug makes it difficult to use preprocessor conditionals within
        !           186: templates.  For example, in this code:
        !           187: 
        !           188: @smallexample
        !           189: template <class T>
        !           190: class list @{
        !           191:   @dots{}
        !           192: #ifdef SYSWRONG
        !           193:   T x;
        !           194: #endif
        !           195:   @dots{}
        !           196: @}
        !           197: @end smallexample
        !           198: 
        !           199: The preprocessor output leaves sourcefile line number information (lines
        !           200: like @samp{# 6 "foo.cc"} when it expands the @code{#ifdef} block.  These
        !           201: lines confuse the compiler while parsing templates, giving a syntax
        !           202: error.
        !           203: 
        !           204: If you cannot avoid preprocessor conditionals in templates, you can
        !           205: suppress the line number information using the @samp{-P} preprocessor
        !           206: option (but this will make debugging more difficult), by compiling the
        !           207: affected modules like this:
        !           208: 
        !           209: @smallexample
        !           210: g++ -P foo.cc -o foo
        !           211: @end smallexample
        !           212: 
        !           213: @cindex parsing errors, templates
        !           214: @item
        !           215: Parsing errors are reported when templates are first
        !           216: @emph{instantiated}---not on the template definition itself.  In
        !           217: particular, if you do not instantiate a template definition at all, the
        !           218: compiler never reports any parsing errors that may be in the template
        !           219: definition.
        !           220: @end itemize
        !           221: 
        !           222: @node Template debugging
        !           223: @section Debugging information for templates
        !           224: 
        !           225: @cindex templates and debugging information
        !           226: @cindex debugging information and templates
        !           227: Debugging information for templates works for some object code formats,
        !           228: but not others.  It works for stabs@footnote{Except that insufficient
        !           229: debugging information for methods of template classes is generated in
        !           230: stabs.} (used primarily in @sc{a.out} object code, but also in the Solaris 2
        !           231: version of @sc{elf}), and the @sc{mips} version of @sc{coff} debugging
        !           232: format.
        !           233: 
        !           234: @sc{dwarf} support is currently minimal, and requires further
        !           235: development.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.