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
    Membre éprouvé
    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 : 41
    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    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 };
    };
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  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
    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.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre éprouvé
    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 : 41
    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
    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