2010-06-03 3 views
8

J'ai un programme C++ et lorsque je tente de le compiler, il donne une erreur:C++ - Erreur: attendu-id non qualifié avant « en utilisant »

calor.h|6|error: expected unqualified-id before ‘using’| 

Voici le fichier d'en-tête de la classe calor:

#ifndef _CALOR_ 
#define _CALOR_ 

#include "gradiente.h" 

using namespace std; 

class Calor : public Gradiente 
{ 
public: 
    Calor(); 
    Calor(int a); 
    ~Calor(); 

    int getTemp(); 
    int getMinTemp(); 
    void setTemp(int a); 
    void setMinTemp(int a); 

    void mostraSensor(); 
}; 
#endif 

Pourquoi cela se produit-il?

Cette classe hérite de gradiente:

#ifndef _GRADIENTE_ 
#define _GRADIENTE_ 

#include "sensor.h" 

using namespace std; 

class Gradiente : public Sensor 
{ 
protected: 
    int vActual, vMin; 
public: 
    Gradiente(); 
    ~Gradiente(); 
} 
#endif 

qui hérite à son tour de sensor

#ifndef _SENSOR_ 
#define _SENSOR_ 

#include <iostream> 
#include <fstream> 
#include <string> 

#include "definicoes.h" 

using namespace std; 

class Sensor 
{ 
protected: 
    int tipo; 
    int IDsensor; 
    bool estadoAlerta; 
    bool estadoActivo; 
    static int numSensores; 
public: 
    Sensor(/*PARAMETROS*/); 
    Sensor(ifstream &); 
    ~Sensor(); 

    int getIDsensor(); 
    bool getEstadoAlerta(); 
    bool getEstadoActivo(); 

    void setEstadoAlerta(int a); 
    void setEstadoActivo(int a); 

    virtual void guardaSensor(ofstream &); 
    virtual void mostraSensor(); 
    // FUNÇÃO COMUM 
    /* virtual int funcaoComum() = 0; 
    virtual int funcaoComum(){return 0;};*/ 
}; 
#endif 

Pour être complet bien, voici definicoes.h

#ifndef _DEFINICOES_ 
#define _DEFINICOES_ 

const unsigned int SENSOR_MOVIMENTO = 0; 
const unsigned int SENSOR_SOM = 1; 
const unsigned int SENSOR_PRESSAO = 2; 
const unsigned int SENSOR_CALOR = 3; 
const unsigned int SENSOR_CONTACTO = 4; 

const unsigned int MIN_MOVIMENTO = 10; 
const unsigned int MIN_SOM = 10; 
const unsigned int MIN_PRESSAO = 10; 
const unsigned int MIN_CALOR = 35; 
#endif 

Qu'est-ce que je fais mal?

Répondre

18

Il y a un point-virgule manquant à la fin de cette classe:

class Gradiente : public Sensor 
{ 
protected: 
    int vActual, vMin; 
public: 
    Gradiente(); 
    ~Gradiente(); 
}      // <-- semicolon needed after the right curly brace. 

De plus, les noms de vos gardes sont illégales comprennent. Les noms qui commencent par un trait de soulignement et une lettre majuscule sont réservés pour l'implémentation C++ (comme le sont les noms contenant un trait de soulignement double) - vous n'êtes pas autorisé à créer de tels noms dans votre propre code. Et vous ne devez jamais utiliser:

using namespace std; 

dans un fichier d'en-tête. Et enfin, le destructeur de votre classe de base Sensor devrait presque certainement être rendu virtuel.

+0

Merci pour vos corrections supplémentaires! –

+3

Juste pour clarifier, la raison pour laquelle vous ne devriez jamais utiliser "using namespace std" (ou avec n'importe quel autre espace de nommage) est que les utilisateurs de votre classe ne s'attendront pas à ce que leur espace global soit pollué namespace std quand ils ne l'ont pas demandé. Habituellement, vous voulez limiter le nombre de choses que vous ajoutez à l'espace de noms global dans vos en-têtes au minimum requis pour faire le travail, sinon vous risquez d'introduire des conflits de noms et d'autres choses amusantes. – George

10

Dans gradiente.h vous avez oublié le point-virgule à la fin de votre déclaration de classe.

Vous devez ceci:

class Gradiente : public Sensor 
{ 
    protected: 
     int vActual, vMin; 
    public: 
     Gradiente(); 
     ~Gradiente(); 
}; 

Voir le point-virgule ajouté?

+2

["Ah, le point-virgule manquant ... La seule raison pour laquelle les filles me parlaient aux journées de l'université."] (Http://www.reddit.com/r/programming/comments/b8ws6/) ' :) ' – sbi

4

Vous avez oublié de laisser le dernier point virgule sur les crochets de fermeture, };, dans la classe gradiente.

Questions connexes