Hoy me encontré con un problema interesante. Considere este simple ejemplo:
template <typename T>
void foo(const T & a) { /* code */ }
// This would also fail
// void foo(const int & a) { /* code */ }
class Bar
{
public:
static const int kConst = 1;
void func()
{
foo(kConst); // This is the important line
}
};
int main()
{
Bar b;
b.func();
}
Al compilar me sale un error:
Undefined reference to 'Bar::kConst'
Ahora, estoy bastante seguro de que esto se debe a static const intque no está definido en ninguna parte, lo cual es intencional porque, según tengo entendido, el compilador debería poder realizar el reemplazo en tiempo de compilación y no necesitar una definición. Sin embargo, dado que la función toma un const int &parámetro, parece que no realiza la sustitución, sino que prefiere una referencia. Puedo resolver este problema realizando el siguiente cambio:
foo(static_cast<int>(kConst));
Creo que esto ahora está obligando al compilador a hacer un int temporal y luego pasar una referencia a eso, lo que puede hacer con éxito en tiempo de compilación.
Me preguntaba si esto fue intencional, o estoy esperando demasiado de gcc para poder manejar este caso. ¿O es algo que no debería estar haciendo por alguna razón?
const int kConst = 1;el mismo resultado. Además, rara vez hay una razón (no puedo pensar en ninguna) para que una función tome un parámetro del tipoconst int &, solo use unintaquí.