Static const (undefined reference avec g++)
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:
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:
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:
+ItemAttributes::MAX_IDF_VALUE
Utiliser l'opérateur + pour transformer la constante en lvalue.
Ou encore utiliser un cast...
Code:
(int)ItemAttributes::MAX_IDF_VALUE
Ou finalement, rajouter une déclaration dans le fichier cpp de la classe qui utilise la constante :
Code:
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...