Problème de compilation XCode

kilik2049

Membre confirmé
13 Juillet 2009
37
0
Nantes
Bonsoir à tous.
Je suis en train de coder en C++ avec XCode, et un problème étrange est apparu.
Ma compilation échoue, alors que tous les bugs sont résolus. Je vais voir, et XCode me dit que l'erreur se situe dans le fichier "Builds labs -> Compile class.ccp" au niveau de la ligne contenant:
_GLIBCXX_BEGIN_NAMESPACE(std)
avec pour intitulé d'erreur: Expected unqualified-id before "namespace"
Mon projet contient mon main (vierge), un fichier classe.ccp et son header associé.
Si le main est seul, avec le code de départ, la compile s'exécute sans problème, mais avec ces 3 fichiers, ça bloque, et je n'ai rien trouvé sur le net.
Je pense que je vais réinstaller XCode, mais avant ça, j'aimerais savoir si vous avez déjà entendu parler de ça !
Merci d'avance.
 
Tu peux réinstaller tout ce que tu veux, moi je te parie que c'est un de tes fichier qui est foireux. :D Il sort d'où ton fichier classe.ccp ? Qu'est-ce qu'il y a dedans ? Qu'est-ce que c'est que cette macro "_GLIBCXX_BEGIN_NAMESPACE" ?
 
Mon fichier classe.cpp c'est tout bêtement un fichier qui fait partie du projet. Voici l'intérieur.

#include "classe.h"
#include "main.cpp"


Cercle::Cercle(double r, double a, double o)
{ rayon = r;
r >= 0;
if (r<0)
{
r=0;
}
abscisse = a;
ordonnee = o; }

void Cercle::aireCercle(double r, double aire)
{
aire = r * r * M_PI;
cout << "Aire du cercle = " << aire << endl;
}

void Cercle::perimCercle(double r, double perim)
{
perim = 2 * M_PI * r;
cout << "Perimetre du cercle = " << perim << endl;
}

void Cercle::setRayon(double x)
{
rayon = x;
}

void Cercle::setAbscisse(double y)
{
abscisse = y;
}

void Cercle::setOrdonnee(double z)
{
ordonnee = z;
}

Duree::Duree(int h, int m, int s)
{ heure = h;
minute = m;
sec = s;
h >= 0;
m >= 0;
s >= 0;
if (h || m || s < 0)
{
h = -h;
m= -m;
s = -s;
}
}
void Duree::setHeure(int he)
{
heure = he;
}

void Duree::setMinute(int mi)
{
minute = mi;
}

void Duree::setSec(int se)
{
sec = se;
}

Rationelle::Rationelle(int n, int d)
{ numerateur = n;
denominateur = d;
if (d=0)
{
d=1;
}
}

void Rationelle::affichageFraction(int n, int d, double fraction)
{
fraction = n/d;

if (fraction > 0)
{
cout << "La fraction est:" << n << "/" << d << endl;
}
else if (n/d < 0)
{
cout << "La fraction est:" << -n << "/" << d << endl;
}
else
{
cout << "La fraction est nulle." << endl;
}

}

void Rationelle::setNumerateur(int num)
{
numerateur = num;
}

void Rationelle::setDenominateur(int den)
{
denominateur = den;
}

Point::point(double constrAbs, double constrOrd)
{
abscissePoint = constrAbs;
ordonneePoint = constrOrd;
}

void Point::affichage(double constrAbs, double constrOrd)
{
cout << "L'abscisse du point est: " << constrAbs << endl;
cout << "L'ordonnee du point est: " << constrOrd << endl;
}

void Point::setAbscissePoint(double abs)
{
abscissePoint = abs;
}

void Point::setOrdonneePoint(double ord)
{
ordonneePoint = ord;
}


La macro est dans un fichier que je ne connais pas. Je l'ai trouvé en faisant cette manip:
build & run
je vois qu'il y a des erreurs, je regarde le détail et je trouve ça.
Il est localisé apparemment dans:
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/localefwd.h:50

Voilà un screen:

 
J'ai mis un "using namespace std;" dans mon main.cpp, c'est pour ça que j'ai fait un include du main :)
Car si je met un "using namespace std;" seulement dans mon classe.cpp, XCode m'affiche plein d'erreurs, comme si "using namespace std;" n'était pas pris en compte.

Ben mon projet, j'ai démarré xcode => nouveau projet en ligne de commande C++ stdc++ (vu que j'ai pas C++ tout seul), et voilà
 
J'ai mis un "using namespace std;" dans mon main.cpp, c'est pour ça que j'ai fait un include du main :)
Car si je met un "using namespace std;" seulement dans mon classe.cpp, XCode m'affiche plein d'erreurs, comme si "using namespace std;" n'était pas pris en compte.
Quelle erreurs ?

Chez moi les deux solutions compilent. :rateau:
Donc fait un projet correct, et pas du bricolage avec des includes, et ça compilera.
 
Des erreurs comme quoi cout et endl ne sont pas valides (logique, si "using namespace std;" est pas pris en compte).
"cout was not declared in this scope"
"Expected unqualified-id before "using" "

En fait, le "using namespace std;" marche que s'il est dans le même fichier que ma fonction main. Donc je suis obligé d'inclure mon main...

 
J'ai mis un "using namespace std;" dans mon main.cpp
Pas terrible ça... tu pers de l'intérêt des namespaces.. peut être dommageable pour le futur de ton projet.


, c'est pour ça que j'ai fait un include du main :)
Car si je met un "using namespace std;" seulement dans mon classe.cpp, XCode m'affiche plein d'erreurs, comme si "using namespace std;" n'était pas pris en compte.
et tu mets les includes adéquats dans ton classe.cpp avant d'accuser le namespace ?

Bloc de code:
#include <iostream>
using namespace std;
 
L'erreur est probablement dans ton .h.
Copie-colle tes 3 fichiers complets ici (balise CODE merci!)


écrire std::cout et std::cin reste dans tt les cas meilleur!
 
Main.cpp

Bloc de code:
#include <iostream>

using namespace std;


int main (int argc, char * const argv[]) {

    return 0;
}


classe.cpp

Bloc de code:
#include <iostream>
#include "classe.h"

using namespace std;

Cercle::Cercle(double r, double a, double o)
{    rayon = r;
    r >= 0;
    if (r<0) 
    {
        r=0;
    }
    abscisse = a;
    ordonnee = o; }

void Cercle::aireCercle(double r, double aire)
{
    aire = r * r * M_PI;
    cout << "Aire du cercle = " << aire << endl;
}

void Cercle::perimCercle(double r, double perim)
{
    perim = 2 * M_PI * r;
    cout << "Perimetre du cercle = " << perim << endl;
}

void Cercle::setRayon(double x)
{
    rayon = x;
}

void Cercle::setAbscisse(double y)
{
    abscisse = y;
}

void Cercle::setOrdonnee(double z)
{
    ordonnee = z;
}

Duree::Duree(int h, int m, int s)
{    heure = h;
    minute = m;
    sec = s; 
    h >= 0;
    m >= 0;
    s >= 0;
    if (h || m || s < 0)
    {
        h = -h;
        m= -m;
        s = -s;
    }    
}
void Duree::setHeure(int he)
{
    heure = he;
}

void Duree::setMinute(int mi)
{
    minute = mi;
}

void Duree::setSec(int se)
{
    sec = se;
}

Rationelle::Rationelle(int n, int d)
{    numerateur = n;
    denominateur = d; 
    if (d=0)
    {
        d=1;
    }
}

void Rationelle::affichageFraction(int n, int d, double fraction)
{
    fraction = n/d;
    
    if (fraction > 0) 
    {
        cout << "La fraction est:" << n << "/" << d << endl;
    }
    else if (n/d < 0)
    {
        cout << "La fraction est:" << -n << "/" << d << endl;
    }
    else 
    {
        cout << "La fraction est nulle." << endl;
    }
    
}

void Rationelle::setNumerateur(int num)
{
    numerateur = num;
}

void Rationelle::setDenominateur(int den)
{
    denominateur = den;
}

Point::Point(double constrAbs, double constrOrd)
{
    abscissePoint = constrAbs;
    ordonneePoint = constrOrd;
}

void Point::affichage(double constrAbs, double constrOrd)
{
    cout << "L'abscisse du point est: " << constrAbs << endl;
    cout << "L'ordonnee du point est: " << constrOrd << endl;
}

void Point::setAbscissePoint(double abs)
{
    abscissePoint = abs;
}

void Point::setOrdonneePoint(double ord)
{
    ordonneePoint = ord;
}

classe.h

Bloc de code:
#include <string>
#include <cmath>

class Cercle {
private:
    double rayon;
    double abscisse;
    double ordonnee;
public:
    Cercle(double r=0, double a=0, double o=0);
    void aireCercle(double r, double aire);
    void perimCercle(double r, double perim);
    void coordonnee();
    void setRayon(double x);
    void setAbscisse(double y);
    void setOrdonnee(double z);
    void point();
    void translation();
    void homotethie();
}

class Duree {
private:
    int heure;
    int minute;
    int sec;
public:
    Duree(int h=0, int m=0, int s=0);
    void affichage();
    void setHeure(int he);
    void setMinute(int mi);
    void setSec(int se);
    void convertir();
    void rajouterSeconde();
}

class Rationelle {
private: 
    int numerateur;
    int denominateur;
public: 
    Rationelle(int n=0, int d=0);
    void affichageFraction(int n, int d, double fraction);
    void setNumerateur(int num);
    void setDenominateur(int den);
    void inverse();
    void entier();
}

class Point {
private:
    double abscissePoint;
    double ordonneePoint;
public:
    Point(double constrAbs=0, double constrOrd=0);
    void affichage(double constrAbs, double constrOrd);
    void setAbscissePoint(double abs);
    void setOrdonneePoint(double ord);
}

(je ne savais pas qu'il y avait une balise code, je m'excuse pour le message précédant).
 
Alors :
- dans le main.cpp supprimer le include et le using qui sont inutiles et déconseillés
- dans le classe.cpp, commence par inclure le . h avant les classes "utilitaires"
- une seule classe par fichier (Point.h/Point.cpp, Rationnelle.cpp/Rationnelle.h ...)
- et le responsable de ton erreur je suppose : dans le .h la déclaration de classe se finit par un ";" :
Bloc de code:
 ....
   void homotethie();
}[B] ; [/B]