<div>EEXXELLENTE</div>
<div>JEJEJE</div>
<div>NO LO HABIA VISTO DE ESA FORMA</div>
<div>GRACIAS</div>
<div><br><br> </div>
<div><span class="gmail_quote">El día 16/10/08, <b class="gmail_sendername">Steven Davidson</b> <<a href="mailto:srd4121@njit.edu">srd4121@njit.edu</a>> escribió:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Hola Pedro, 
<div><span class="e" id="q_11d0705e7e42e8d9_1"><br><br>Pedro Mateo wrote:<br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">hola a todos<br>tengo la siguiente plantilla<br> template<typename DATA,const bool borrar_en_destructor=false><br>
class claseX{<br>     DATA data;      public:<br>     claseX(const DATA& x):data(x){}<br>     ~claseX(){<br>             #if borrar_en_destructor==true<br>                    delete data;<br>             #endif<br>      }<br>
     }<br> como DATA puede ser cualquier tipo, pero si es un puntero puede darse<br>el caso de que yo desee que la clase le de un delete al puntero al<br>ser destruida la instancia<br> el codigo que he propuesto no funciona y me gustaria saber si estoy haciendo algo que no se puede o estoy haciendo algo mal<br>
 <br></blockquote><br></span></div>Efectivamente, tienes un error gramatical que está aquí:<span class="q"><br><br>#if borrar_en_destructor==true<br><br></span>Ten presente que # implica una directiva del precompilador y por tanto la expresión que sigue debe poder ser evaluado por el precompilador. La cosntante 'borrar_en_destructor' pertenece a C++ y no existe como tal en la precompilación; o sea, el precompilador no entiende lo que es 'borrar_en_destructor'. Podrías usar 'if' del lenguaje de C++ y no su homólogo, la directiva del precompilador #if. Esto es,<br>
<br>~claseX()<br>{<br> if( borrar_en_destructor )  delete data;<br>}<br><br><br>De todas maneras, no sugiero implementar este código de esta manera. En su lugar, define plantillas parcialmente especializadas. Como el problema es que el tipo de dato puede ser un puntero, entonces sugiero crear tal especialidad parcial. Esto es,<br>
<br>template< typename DATA ><span class="q"><br>class claseX<br>{<br> DATA data;<br>public:<br> claseX( const DATA& x ) : data(x)  {}<br> ~claseX()  {}<br></span>};<br><br>template< typename DATA ><br>class claseX< DATA * ><br>
{<br> DATA *data;<br>public:<br> claseX( const DATA* x ) : data(0)<br> {<br>   data = new DATA;<br>   *data = DATA(0);  // Asignamos 0 al 'DATA' apuntado<br> }<br> ~claseX()<br> {<br>   delete data;<br> }<br>};<br>
<br><br>Si usamos un tipo de dato que es un puntero, entonces usamos la especialización parcial que hemos creado. Si el tipo del dato del argumento de la plantilla no es un puntero, entonces usamos la definición de la plantilla general.<br>
<br><br>Espero que esto te sirva.<br><br>Steven<br><br><br>_______________________________________________<br>Lista de correo Cconclase <a onclick="return top.js.OpenExtLink(window,event,this)" href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a onclick="return top.js.OpenExtLink(window,event,this)" href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a onclick="return top.js.OpenExtLink(window,event,this)" href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br></blockquote></div>
<br>