|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.