Bonjour,
Voilà, j'ai un problème tout con mais je sèche dessus depuis 50 minutes. J'ai déclaré une constante statique dans une class :
Selon la spec je devrais avoir le droit de l'initialiser ici directement, cela compile sous gcc 4.3.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class ItemAttributes { public: /** * Max possible IDF weight. */ static const int MAX_IDF_VALUE = 5; }
Par contre lorsque je veux passer cette constante à une fonction qui mange une référence, le linker m'envoie un message d'erreur "undefined reference".
Si la variable statique n'est pas utilisée comme référence en revanche ça fonctionne...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void SimCalculatorIdf::computeItemsSimWithIdf( const ItemAttributes& leftItem, const ItemAttributes& rightItem, comparisonStats& statForThisType ) const { //(....) //ce code est accepté int matches[ItemAttributes::MAX_IDF_VALUE + 1]; for (int i = 0; i <= ItemAttributes::MAX_IDF_VALUE; i++) matches[i] = 0; //pas celui-ci const int arrayLimit = std::min(ItemAttributes::MAX_IDF_VALUE, totalMatches); //(...) }
J'ai cherché sur le net, vu différentes solutions, ce serait du à une vieille spec vaseuse que GCC a à tout prix voulu implémenter correctement, bref.
Donc la solution qui marche serait d'écrire
Utiliser l'opérateur + pour transformer la constante en lvalue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part +ItemAttributes::MAX_IDF_VALUE
Ou encore utiliser un cast...
Ou finalement, rajouter une déclaration dans le fichier cpp de la classe qui utilise la constante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part (int)ItemAttributes::MAX_IDF_VALUE
Les 2 premières solutions ont l'air de vieux hacks, la 3e semble plus juste mais je suis pas sûr de ce qu'elle implique, ni même si ma constante vaudra toujours 5...
Code : Sélectionner tout - Visualiser dans une fenêtre à part const int ItemAttributes::MAX_IDF_VALUE;
Si quelqu'un peut m'aider à y voir plus clair...
Partager