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 :

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;
}
Selon la spec je devrais avoir le droit de l'initialiser ici directement, cela compile sous gcc 4.3.

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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
+ItemAttributes::MAX_IDF_VALUE
Utiliser l'opérateur + pour transformer la constante en lvalue.

Ou encore utiliser un cast...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
(int)ItemAttributes::MAX_IDF_VALUE
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
const 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...

Si quelqu'un peut m'aider à y voir plus clair...