Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 486 — #524<br />
✐<br />
Capítulo 16. Introducción a las Plantillas<br />
16.3.1. Definiciones de función no inline<br />
Por supuesto, hay veces <strong>en</strong> las que se querrá t<strong>en</strong>er definición de funciones no<br />
inline. En ese caso, el compilador necesita ver la declaración del template antes<br />
que la definición de la función miembro. Aquí está el ejemplo anterior, modificado<br />
para mostrar la definición del miembro no inline.<br />
//: C16:Array2.cpp<br />
// Non-inline template definition<br />
#include "../require.h"<br />
template<br />
class Array {<br />
<strong>en</strong>um { size = 100 };<br />
T A[size];<br />
public:<br />
T& operator[](int index);<br />
};<br />
template<br />
T& Array::operator[](int index) {<br />
require(index >= 0 && index < size,<br />
"Index out of range");<br />
return A[index];<br />
}<br />
int main() {<br />
Array fa;<br />
fa[0] = 1.414;<br />
} ///:~<br />
Cualquier refer<strong>en</strong>cia al nombre de una plantilla de clase debe estar acompañado<br />
por la lista de argum<strong>en</strong>tos del template, como <strong>en</strong> Arrayoperator[]. Se puede<br />
imaginar que internam<strong>en</strong>te, el nombre de la clase se rell<strong>en</strong>a con los argum<strong>en</strong>tos de<br />
la lista de argum<strong>en</strong>tos de la plantilla para producir un nombre id<strong>en</strong>tificador único<br />
de la clase for cada instanciación de la plantilla.<br />
Archivos cabecera<br />
Incluso si se crean definiciones de funciones no inline, normalm<strong>en</strong>te se querrá<br />
poner todas las declaraciones y definiciones de un template <strong>en</strong> un archivo cabecera.<br />
Esto parece violar la regla usual de los archivos cabecera de «No poner nada que<br />
asigne almac<strong>en</strong>ami<strong>en</strong>to», (lo cual previ<strong>en</strong>e múltiples errores de definición <strong>en</strong> tiempo<br />
de <strong>en</strong>lace), pero las definiciones de plantillas son especial. Algo precedido por<br />
template significa que el compilador no asignará almac<strong>en</strong>ami<strong>en</strong>to <strong>en</strong> ese<br />
mom<strong>en</strong>to, sino que se esperará hasta que se lo indiqu<strong>en</strong> (<strong>en</strong> la instanciación de una<br />
plantilla), y que <strong>en</strong> algún lugar del compilador y del <strong>en</strong>lazador hay un mecanismo<br />
para eliminar las múltiples definiciones de una plantilla idéntica. Por lo tanto casi<br />
siempre se pondrá toda la declaración y definición de la plantilla <strong>en</strong> el archivo<br />
cabecera por facilidad de uso.<br />
Hay veces <strong>en</strong> las que puede ser necesario poner las definiciones de la plantilla<br />
<strong>en</strong> un archivo cpp separado para satisfacer necesidades especiales (por ejemplo,<br />
forzar las instanciaciones de las plantillas para que se <strong>en</strong>cu<strong>en</strong>tr<strong>en</strong> <strong>en</strong> un único archivo<br />
dll de Windows). La mayoría de los compiladores ti<strong>en</strong><strong>en</strong> algún mecanismo para<br />
486<br />
✐<br />
✐<br />
✐<br />
✐