Undefined reference to static const int

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 la static const int n'est défini nulle part, 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?

Dans la pratique, vous pourriez faire const int kConst = 1; avec le même résultat. Aussi, il y a rarement une raison (je ne peux penser à aucun) pour une fonction qui prend un paramètre de type const int & - il suffit d'utiliser une int ici.
la fonction réelle a été un modèle, je vais modifier ma question de le mentionner.
pour info, ne pas le faire static donne une erreur "ISO C++ forbids l'initialisation de membre "kConst'...faire "kConst' static.'
Mon mal, merci pour la correction.
L'ennuyeux, c'est que cette erreur peut s'afficher dans anodin utilise comme std::min( some_val, kConst), depuis std::min<T> a des paramètres de type T const &, et la conséquence en est que nous avons besoin de passer une référence à le kConst. J'ai trouvé qu'il ne se produisait que lorsque l'optimisation est éteint. Fixe à l'aide d'une statique de la fonte.

OriginalL'auteur JaredC | 2011-03-22