web-dev-qa-db-fra.com

Le compilateur se plaint de mes paramètres par défaut?

J'ai des problèmes avec ce morceau de code, après avoir pris cette classe dans le fichier main.cpp et l'avoir divisée en .h et .cpp, le compilateur a commencé à se plaindre des paramètres par défaut que j'utilisais dans un vide.

/* PBASE.H */
    class pBase : public sf::Thread {
private:
    bool Running;

public:
    sf::Mutex Mutex;
    Word OriginalColor;
    pBase(){
        Launch();
        Running = true;
        OriginalColor = 0x7;
    }
    void progressBar(int , int);
    bool key_pressed();
    void setColor( int );
    void setTitle( LPCWSTR );
    bool test_connection(){
        if(Running == false){
            return 0;
        }
        else{
            return 1;
        }
    return 0;
    }
    void Stop(){
        Running = false;
        if(Running == false) Wait();
    }
};

    /* PBASE.CPP */

    // ... other stuff above

    void pBase::setColor( int _color = -1){
        if(_color == -1){
             SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ),FOREGROUND_INTENSITY | OriginalColor);
             return;
        }
        SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ),FOREGROUND_INTENSITY | _color);

}

Et l'erreur, tirée de VC2010

Erreur 4 erreur C2572: 'pBase :: setColor': redéfinition du paramètre par défaut: paramètre 1

42
Christian

Vous devez spécifier les valeurs par défaut des arguments uniquement dans la déclaration mais pas dans la définition.

 class pBase : public sf::Thread {
     // ....
     void setColor( int _color = -1 );
     // ....
 } ;

 void pBase:: setColor( int _color )
 {
     // ....
 }

La valeur par défaut de l'argument d'une fonction membre peut aller dans la déclaration ou la définition mais pas les deux. Citation de ISO/IEC 14882: 2003 (E) 8.3.6

6) À l'exception des fonctions membres des modèles de classe, les arguments par défaut dans une définition de fonction membre qui apparaît en dehors de la définition de classe sont ajoutés à l'ensemble d'arguments par défaut fournis par la déclaration de fonction membre dans la définition de classe. Les arguments par défaut pour une fonction membre d'un modèle de classe doivent être spécifiés dans la déclaration initiale de la fonction membre dans le modèle de classe. [Exemple:

class C { 
    void f(int i = 3);
    void g(int i, int j = 99);
};

void C::f(int i = 3)   // error: default argument already
{ }                    // specified in class scope

void C::g(int i = 88, int j)    // in this translation unit,
{ }                             // C::g can be called with no argument

—Fin exemple]

Selon l'exemple standard fourni, cela devrait en fait fonctionner comme vous l'avez fait. À moins que vous n'ayez fait comme ceci , vous ne devriez pas réellement avoir l'erreur. Je ne sais pas pourquoi cela a fonctionné dans votre cas avec ma solution. Probablement quelque chose lié au studio visuel, je suppose.

127
Mahesh

Bien! Cela a fonctionné (un peu bizarre cependant parce que cela fonctionnait bien quand j'avais tout le code dans un seul fichier).

J'ai également eu ce problème lorsque j'ai commencé à déplacer du code dans plusieurs fichiers. Le vrai problème est que j'ai oublié d'écrire

#pragma once

en haut du fichier d'en-tête, et donc il redéfinissait les fonctions plusieurs fois (chaque fois que le fichier d'en-tête était appelé à partir d'un fichier parent), cela provoquait l'erreur redéfinition du paramètre par défaut.

12
MasterHD