Pregunta

Como en la pregunta, si defino un operador de cadenas en mi clase:

class Literal {
  operator string const () {
    return toStr ();
  };

  string toStr () const;
};

Y luego lo uso:

Literal l1 ("fa-2bd2bc3e0");
cout << (string)l1 << " Declared" << endl;

Con un reparto explícito, todo sale bien, pero si elimino la (cadena), el compilador dice que necesita un operador de reparto declarado en std :: string. ¿No debería lanzar mi tipo automáticamente? Resuelto: estoy sobrecargando el operador << (Ostream & OS, const literal y l).

¿Fue útil?

Solución

No ... std :: string tendría que tener un constructor que tomara literal como argumento.

Lo que podría hacer es sobrecargar el operador << para su clase literal y tenerlo fundido e inserte en la transmisión allí.

ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
    stream << (string) rhs;
    return stream;
}

Otros consejos

Respuesta corta: sigue usando un elenco o toStr(), o escribe el tuyo operator<< función. (Yo preferiría l1.toStr() a (string)l1.)

Respuesta larga: Esto podría funcionar si la biblioteca estándar tuviera una función

std::ostream& operator<<( std::ostream&, std::string const& );

Lo que casi hace, pero no técnicamente. Ambas cosas ostream y string son realmente typedefs de instancias de plantilla. Y hay una función de plantilla para insertar una en la otra.

// This is somewhat simplified.  For the real definitions, see the Standard
// and/or your complying implementation's headers.
namespace std {
  typedef basic_string<char> string;
  typedef basic_ostream<char> ostream;

  template <typename CharT>
  basic_ostream<CharT>& operator<<(
    basic_ostream<CharT>&, 
    basic_string<CharT> const&);
}

Entonces cuando usas cout << str donde el tipo de str es std::string, puede averiguar usar esa función de plantilla, con CharT = char.

Pero C ++ no le permite que el compilador descubra tanto una conversión de tipo implícito (Literal a string) y deducir los parámetros de la plantilla de función de la plantilla (CharT = char) en la misma llamada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top