<div dir="ltr">Hola José,<div class="gmail_extra"><br><div class="gmail_quote">2013/1/28 José <span dir="ltr"><<a href="mailto:enriquez.ja@hotmail.com" target="_blank">enriquez.ja@hotmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Hola, es mi primera intervención, me ha ayudado mucho este curso, y sigo aprendiendo, y gracias por la ayuda, mi duda es:<br></blockquote><div><br></div><div style>Ante todo, bienvenido a la lista de correo-e.</div><div><br>
</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Tengo un programa dividido en tres parte, un fichero que declara una clase, otro que define todas las funciones miembro y sobrecarga de operadores, y otro con el programa principal con la función main, lo que pasa es que tengo declarada la sobrecarga del operador de flujo de salida << de la siguiente manera:<br>

<br>
friend ostream& operator<< (ostream& os, const claseA&);<br>
<br>
Tambien tengo implementada la funcion de sobrecarga, pero al compilar me manda un error que dice ISO C++ prohibe la declaracion de ostream sin tipo, y tambien que no es ni funcion ni funcion miembro y que no puede ser declarada como friend.<br>

<br></blockquote><div><br></div><div style>Esto significa que se ha topado con 'ostream' y no tiene ni idea de qué es 'ostream', pero parece que estás intentando definirla dentro de esta declaración.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Solucioné esto declarando el using namespace std; en el fichero que la declara la clase y funciona todo bien, mi duda es porque debo hacer esta declaración aun y cuando ya la tengo declarada en el fichero del programa principal? Y ¿existe otra manera de hacer la </blockquote>
<div><br></div><div style>Porque existe dos ficheros fuente. El compilador compila - valga la redundancia - cada fichero fuente por separado. El enlazador es quien liga o enlaza los ficheros compilados llamados "objeto" junto con las bibliotecas. Estás #incluyendo el fichero de cabecera de la clase en dos ficheros fuente diferentes: en el de "main" y en el de la definición de las funciones miembro de la clase.</div>
<div style><br></div><div style>En general, sugiero #incluir todos los ficheros de cabecera que necesites para definir cada fichero fuente o de cabecera, sin pensar en el uso de tal fichero fuente o de cabecera. No pienses en las dependencias creadas por la inclusión de "este fichero" en otros ficheros; sólo piensa en las necesidades de "este fichero". Por ejemplo,</div>
<div style><br></div><div style>// algo.h</div><div style>#include <iostream><br></div><div style>#include <string><br><br>class Algo</div><div style>{</div><div style>private:<br>  std::string str;</div><div style>
<br>public:<br>  Algo( std::string &ref );</div><div style>  Algo( std::istream &is );</div><div style>};</div><div style><br></div><div style><div>// algo.cpp</div><div>#include <iostream><br></div><div>#include <string><br>
<div>#include "algo.h"</div><div><br></div>Algo::Algo( std::string &ref )<br>{<br>  ...</div><div>}</div><div><br></div><div>Algo::Algo( std::istream &is )</div><div>{</div><div>  ...</div><div>}</div><div>
<br></div></div><div><br></div><div style>Como necesitamos 'string' e 'istream' en "algo.h", incluimos sus ficheros de cabecera. Lo mismo sucede en "algo.cpp". No sugiero pensar que como incluye "algo.h", no tiene que incluir los otros dos ficheros de cabecera, sino piensa en lo que necesita "algo.h" y lo que necesita "algo.cpp" en cada fichero.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">declaracion de sobrecarga sin declarar el namespace std? algo asi como se usa en std::cout. Solo quiero salir de la duda agradezco la ayuda que me puedan dar.<br>
</blockquote><div><br></div><div style>Ciertamente, puedes usar 'std::' explícitamente. De hecho, es aconsejable hacer esto. La idea de usar espacios denominados (o con nombre) es que no "contaminamos" el espacio global. Al declarar: 'using nampespace std', estamos haciendo eso mismo: contaminar la globalidad al incluir 'std' en ella.</div>
<div style><br></div><div style>A la hora de escribir las versiones finales de nuestros proyectos, deberías usar 'std::' explícitamente.</div><div><br></div><div><br></div><div style>Espero haber aclarado las dudas.</div>
<div><br></div><div style>Steven</div><div style><br></div></div></div></div>