IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Static const (undefined reference avec g++)


Sujet :

C++

  1. #1
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut 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 : 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...

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 580
    Points
    41 580
    Par défaut
    La troisième EST la plus juste, mais sort peut-être du contexte "constante connue à la compilation".

    Mais si ta constante est un int, peut-être devrais-tu envisager d'en faire une enum?

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class ItemAttributes
    {
    public:
     
    	/**
             * Max possible IDF weight.
             */
    	enum { MAX_IDF_VALUE = 5 };
    };

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    La troisième EST la plus juste, mais sort peut-être du contexte "constante connue à la compilation".
    Elle n'en sort pas, et peut encore être utilisée, par exemple, pour déclarer une taille de tableau.

  4. #4
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Ok merci beaucoup .
    Ca me semblait assez bizarre cette redéclaration, j'avais peur de me retrouver avec une valeur indéfinie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. "Undefined reference" avec Ubuntu 12.04
    Par morbli dans le forum Ubuntu
    Réponses: 2
    Dernier message: 02/11/2012, 12h55
  2. Undefined reference avec les fonctions d'une class
    Par romnair dans le forum Débuter
    Réponses: 5
    Dernier message: 10/04/2012, 16h40
  3. problème d'undefined reference avec codeblocks
    Par matstriker dans le forum C
    Réponses: 4
    Dernier message: 20/04/2011, 13h26
  4. Undefined reference avec code blocks
    Par Airlink dans le forum Débuter
    Réponses: 1
    Dernier message: 14/06/2008, 19h40
  5. undefined reference avec mingw
    Par Plomeg dans le forum C++
    Réponses: 5
    Dernier message: 06/12/2007, 17h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo