“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& operator << (const data_t &data) {
printf("[%s] %d\n", __func__, data.val);
return *this;
};
void func(const data_t &data) {
printf("[%s] %d\n", __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.
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ónfunc()
espera un objeto de tipoA::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 usandoA::data_t{100}
en su lugar.