J'ai couru dans un problème intéressant aujourd'hui. Considérons cet exemple simple:
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();
}
Lors de la compilation j'obtiens une erreur:
Undefined reference to 'Bar::kConst'
Maintenant, je suis assez sûr que c'est parce que l' static const int
n'est pas définie n'importe où, ce qui est intentionnel, car, selon ma compréhension, le compilateur doit être en mesure de faire le remplacement au moment de la compilation et pas besoin d'une définition. Toutefois, étant donné que la fonction prend un const int &
paramètre, il semble ne pas faire de la substitution, et préférant une référence. Je peux résoudre ce problème en faisant les changements suivants:
foo(static_cast<int>(kConst));
Je crois que c'est maintenant forcer le compilateur à faire un temporaire de type int, et puis passer une référence à ce qui peut réussir à faire au moment de la compilation.
Je me demandais si c'était intentionnel, ou suis-je en attendre trop de gcc pour être en mesure de gérer ce cas? Ou est-ce quelque chose que je ne devrais pas être en train de faire pour une raison quelconque?