Компилятор жалуется на мои параметры по умолчанию?
У меня проблемы с этим фрагментом кода, после того как я взял этот класс из файла 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
3 ответа
Вы должны указать значения по умолчанию для аргументов только в объявлении, но не в определении.
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
- конец примера]
В соответствии со стандартным примером, он должен работать так, как вы. Если вы не сделали так, вы не должны получить ошибку. Я не уверен, почему это сработало в вашем случае с моим решением. Наверное, что-то связано с визуальной студией.
Хорошо! Это работало (немного странно, хотя, потому что это работало хорошо, когда у меня был весь код в одном файле).
У меня также была эта проблема, когда я начал перемещать код в несколько файлов. Настоящая проблема заключалась в том, что я забыл написать
#pragma once
в верхней части файла заголовка, и поэтому он переопределял функции несколько раз (каждый раз, когда файл заголовка вызывался из родительского файла), это вызывало переопределение ошибки параметра по умолчанию.
В моем случае у меня есть один и тот же заголовочный файл по нескольким путям. Ошибка решается удалением лишних файлов.