|
|
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.