IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème lors de la compilation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2020
    Messages : 2
    Par défaut Problème lors de la compilation
    Bonjour à tous,

    Je code en C++ depuis quelques mois. Je suis en train de coder des fichiers tests (en utilisant google test) dans le cadre d'un projet, et je rencontre un problème que je n'arrive pas à résoudre.

    Voici un code ressemblant dans les grandes lignes à celui qui me pose problème, simplement pour avoir une idée de ce qui est implémenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include <gtest/gtest.h>
    #include <iostream>
    #include <vector>
     
    namespace n{
       std::vector<double> numbers;
     
       for (size_t i(0); i<100;++i){
         numbers.push_back(i);
       }
     
       [...]
     
    }
     
    TEST(MyClass,sum){
    [...]
    }
     
    TEST(MyClass,average){
    [...]
    }
    Cependant, numbers n'est pas reconnu comme étant un vector, et lors de la compilation, j'ai l'erreur suivante qui apparaît : " unknown type name 'numbers' " m'indiquant la ligne de déclaration du tableau dans le namespace.
    J'ai ajouté la ligne suivante pour tenter de voir l'origine du problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cout<<"entered in namespace"<<std::endl;
    Et là l'erreur suivante apparaît : "no type named 'cout' in namespace 'std' "
    Pourtant, j'utilise la librairie standard dans presque tous mes autres fichiers, et ça fonctionne très bien. Mais là, si je l'utilise dans le namespace créé, ce problème apparaît. De plus, j'utilise à chaque fois les mêmes options de compilation, et ce problème n'apparaît avec aucun autre fichier.
    Auriez-vous une idée du problème ?

    Merci pour votre aide

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut, et bienvenue sur le forum.

    tu as créé un espace de noms (ou une boite de rangement, si tu préfères) nommé(e) n. Soit. Même si tu aurais pu choisir un autre nom pour cette boite, c'est déjà vraiment pas mal d'y avoir pensé

    Dans cette boite de rangement, tu as placé une donnée (globale, dans les limites de la boite) nommée numbers qui est de type std::vector<double>.

    Ca, c'est déjà beaucoup plus discutable, car les variables globales, c'est mal, mais bon, c'est encore quelque chose que le compilateur peut comprendre

    Par contre, les lignes 9 (la boucle for), 10 (numbers.push_back) et 11 (l'accolade fermante), ca, ce sont des instructions qui devront être traduites par le compilateur en vue d'indiquer au processeur ce qu'il doit faire.

    Et c'est là que les choses commences à se gâter car, vois tu, le compilateur n'accepte de traduire des instructions à exécuter que (je vais énormément simplifier ici )... quand les dites instructions se trouvent dans une fonction et surtout, que le compilateur sait qu'il est occupé à traduire des instructions qui décrivent ce qu'une fonction doit faire.

    Or, pour le compilateur sache qu'il est occupé à traduire des instructions qui font partie d'une fonction (on dit qu'il travaille sur l'implémentation d'une fonction), il faut respecter une syntaxe bien particulière qui est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <type de retour> <nom de la fonction> (<liste éventuelle de paramètre>) { // l'implémentation commence après l'accolade ouvrante
     <liste des instructions à traduire>
    } /l'implémentation de la fonction s'achève ici
    Un exemple qui pourrait marcher serait donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* ca, c'est hors de la fonction */
    #include <iostream>
    /*
    |->type de retour (type de la donnée renvoyée à la fin de la fonction
    |    |->nom de la fonction
    |    |
    |    |     |->liste éventuelle de paramètres (vide dans le cas présent
    |    |     |
    */
    int main() { -->début de la fonction
        /*instructions à exécuter */
        std::cout<<"tu vois, ca fonctionne\n";
        return 0; // renvoie une valeur signifiant "tout s'est bien passé"
    }
    Pas de bol, le compilateur est du genre pointilleux, et, comme il ne sait pas qu'il est face à des instructions qu'il doit traduire, ben, il va pas s'avouer vaincu aussi vite.
    Il va d'abord se dire que tu essaye de définir un nouveau "type défini par l'utilisateur".

    Sauf que, pour qu'il sache que tu es effectivement occupé à le faire, il doit avoir croisé l'un des mots clés suivants:
    usingenumclassstructunionselon une syntaxe qui prend la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <enum | class | struct | union> <nom du type>{
        <contenu du type>
    };
    ou, pour le mot clé using une syntaxe ressemblant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using <nouveau nom pour le type> = <ancien nom pour le type> ;
    ce qui, en code réel ressemblerait à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*
     |-> le mot clé
     |       |->le nom du type
     |       |
    */
    struct Point{
        /* le contenu du type */
        int x;
        int y;
    };
    ou, pour le mot clé using à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /*
     |-> le mot clé using
     |      |->le nouveau nom pour le type
     |      |                    |->l'ancien nom du type 
     |      |                    |
    /*
    using UnEntierSigne = unsigned int;
    Et, comme il n'a rien trouvé de tout cela, mais qu'il refuse de s'avouer vaincu pour autant, il va tenter une dernière possibilité: peut-être es tu occupé à déclarer une variable globale (un peu dans le genre de ce que tu as fait avec std::vector<double> numbers;Sauf que, pour pouvoir déclarer une nouvelle variable, qu'elle soit globale ou non, il faut respecter la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <type de la variable> <nom de la variable>;
    et qui pourrait prendre la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    |-> type de la variable
    |     |-> nom de la variable
    |     |
    int monEntierAmoi;
    avec, pour bien compliquer le tout, la restriction que le terme "type de la variable" doit correspondre à la lettre près à un des (très nombreux) types dont le compilateur a connaissance au moment où il analyse cette ligne.
    • Si c'est char, short, int long, long long, float, double ou long double, ca marche, parce que ce sont des types primitifs (qu'il connaitra tout le temps)
    • Si c'est std::vector<double>, ca marche, grâce à l'inclusion du fichier d'en-tête <vector>
    • Si c'est std::string ca peut marcher si tu as inclus le fichier d'en-tête <string>
    • j'en passe beaucoup et peut-etre de meilleurs...

    Manque de bol, ce qu'il prend comme le nom d'un type de donnée, c'est le terme numbers et ce terme ne correspond absolument pas au nom d'un type qu'il connait.

    Comme il n'a plus solution, il n'a pas d'autre choix que celui de rendre les armes, en t'indiquant une erreur avant de s'arrêter purement et simplement

    Et comme la dernière chose qu'il a testée était le fait que tu déclarais peut-être une variable, mais que la syntaxe n'était absolument pas respectée (ce qui en soi suffit à provoquer une erreur), il te l'affiche bien gentiment sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     unknown type name 'numbers'
    qui signifie littérallement
    nom de type inconnu pour numbers
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2020
    Messages : 2
    Par défaut
    Bonjour,
    Merci beaucoup pour votre réponse ! je comprends mon erreur maintenant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème lors de la compilation
    Par snake264 dans le forum Dev-C++
    Réponses: 5
    Dernier message: 14/11/2006, 20h07
  2. Réponses: 4
    Dernier message: 25/09/2006, 10h24
  3. Problème lors de la compilation
    Par nicolas66 dans le forum C++
    Réponses: 9
    Dernier message: 25/07/2006, 22h32
  4. problème lors de la compilation : Unsatisfied symbols
    Par la schtroumpfette dans le forum C
    Réponses: 6
    Dernier message: 29/12/2005, 09h52
  5. Réponses: 7
    Dernier message: 27/09/2005, 21h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo