es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

“Se esperaba una expresión principal antes del token ‘{‘ al llamar a la sobrecarga de ‘<<' con un tipo de dato personalizado"

Tengo una clase simple ‘A’ con el siguiente contenido:

class A {
public:
struct data_t {
int32_t val;

    data_t(int32_t _val) :
        val(_val) {
        ;
    };
};

A&amp; operator &lt;&lt; (const data_t &amp;data) {
    printf(&quot;[%s] %d\n&quot;, __func__, data.val);
    return *this;
};

void func(const data_t &amp;data) {
    printf(&quot;[%s] %d\n&quot;, __func__, data.val);
}

};

Intenté los siguientes códigos y obtuve:

A a;

a<<{100}; // "se esperaba una expresión primaria antes del token ‘{‘"
a<<A::data_t{100}; // OK.
a.func({100}); // OK.

¿Por qué a<<{100}; no funciona y a.func({100}); funciona?

No quiero utilizar la segunda oración porque es demasiado larga y complicada para leer.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual a<<{100}; no está funcionando es porque el compilador no sabe cómo interpretar las llaves {} por sí solas. No está claro si representan un objeto de un cierto tipo o simplemente una lista de valores.

    Por otro lado, a.func({100}); está funcionando porque las llaves {} están dentro de una llamada a función, donde el compilador es capaz de deducir el tipo del argumento basado en la firma de la función. En este caso, la función func() espera un objeto de tipo A::data_t, por lo que el compilador sabe cómo interpretar las llaves como una llamada al constructor de ese tipo.

    Para que a<<{100}; funcione, podrías especificar explícitamente el tipo usando A::data_t{100} en su lugar.

Comments are closed.