Компилятор жалуется на мои параметры по умолчанию? - PullRequest
42 голосов
/ 02 июня 2011

У меня проблемы с этим фрагментом кода, после того как я взял этот класс из файла main.cpp и разделил его на .h и .cpp, компилятор начал жаловаться на параметры по умолчанию, которые я использовал в void.

/* 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);

}

и ошибка, взятая из VC2010

Ошибка 4, ошибка C2572: «pBase :: setColor»: переопределение параметра по умолчанию: параметр 1

Ответы [ 2 ]

124 голосов
/ 02 июня 2011

Необходимо указать значения по умолчанию для аргументов только в объявлении, но не в определении.

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

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

Значение по умолчанию для аргумента функции-члена может идти в объявлении или определениино не оба.Цитата из ИСО / МЭК 14882: 2003 (E) 8.3.6

6) За исключением функций-членов шаблонов классов, добавляются аргументы по умолчанию в определении функции-члена, которое появляется вне определения классана набор аргументов по умолчанию, предоставляемых объявлением функции-члена в определении класса.Аргументы по умолчанию для функции-члена шаблона класса должны быть указаны в первоначальном объявлении функции-члена в шаблоне класса.[Пример:

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

- конечный пример]

В соответствии со стандартным примером, он на самом деле должен работать так, как вы.Если вы не сделали , как это , вы не должны получить ошибку.Я не уверен, почему это сработало в вашем случае с моим решением.Наверное, что-то связано с визуальной студией.

11 голосов
/ 15 июня 2013

Хорошо!Это сработало (хотя и немного странно, потому что работало нормально, когда у меня был весь код в одном файле).

У меня также была эта проблема, когда я начал перемещать код в несколько файлов.Реальная проблема заключалась в том, что я забыл написать

#pragma once

в верхней части файла заголовка, и поэтому он несколько раз переопределял функции (каждый раз, когда файл заголовка вызывался из родительского файла),это вызвало переопределение параметра по умолчанию error.

...