2011-06-02 4 views
28

Tengo problemas con este fragmento de código, después de tomar esta clase del archivo main.cpp y dividirla en .h y .cpp, el compilador comenzó a quejarse sobre los parámetros predeterminados que estaba usando en un vacío.¿El compilador se queja de mis parámetros predeterminados?

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

} 

y el error, tomada de VC2010

error 4 error C2572: 'PBASE :: setColor': redefinición de los parámetros por defecto: parámetro 1

Respuesta

89

Debe especificar los valores predeterminados para los argumentos solo en la declaración pero no en la definición.

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

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

El valor por defecto para el argumento de una función miembro puede ir en la declaración o definición, pero no ambos. Presupuesto de ISO/IEC 14882: 2003 (E) 8.3.6

6) Excepto para funciones miembro de plantillas de clase, los argumentos predeterminados en una definición de función miembro que aparece fuera de la definición de clase se añaden al conjunto de los argumentos predeterminados proporcionados por la declaración de la función miembro en la definición de la clase. Los argumentos por defecto para una función miembro de una plantilla de clase se especificarán en la declaración inicial de la función miembro dentro de la plantilla de clase. [Ejemplo:

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 ejemplo]

De acuerdo con el ejemplo provista de fábrica en realidad debería funcionar de la manera que lo hizo. A menos que haya hecho like this, no debería obtener el error. No estoy seguro de por qué funcionó realmente en tu caso con mi solución. Probablemente algo relacionado con el estudio visual, supongo.

+1

¡Muy bien! Funcionó (aunque un poco raro porque funcionaba bien cuando tenía todo el código en un archivo). – Christian

7

¡Muy bien! Funcionó (aunque un poco raro porque funcionaba bien cuando tenía todo el código en un archivo).

También tuve este problema cuando comencé a mover el código en varios archivos. El verdadero problema era que me había olvidado de escribir

#pragma once 

en la parte superior del archivo de cabecera, y por lo que se redefiniendo las funciones múltiples veces (cada vez que el archivo de cabecera estaba siendo invocado desde un archivo principal), esto causó la redefinición del error predeterminado error.

+0

Gracias por eso, comencé a pensar que estoy perdiendo la cabeza debido a este error. – Wodzu

+0

Tenía una matriz '' 'estática const char''' definida en mi función y' '' #pragma una vez''' hizo el truco y aceptó el argumento predeterminado que yo había establecido. – reliasn

Cuestiones relacionadas