Forum Programmation.c++ error: expected identifier before ‘&’ token

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
3
juil.
2021

Salutations !
Je (re)débute en C++, j'essaye un peu des trucs, et je suis tombé sur une erreur que je comprends pas trop…

le code suivant

class A {

};

class B {
    B(A* a) {

    }
};

class C {
    A a;
    B b(&a);
};

me retourne à la compilation

$ gcc test.cpp 
test.cpp:13:9: error: expected identifier before ‘&’ token
   13 |     B b(&a);
      |         ^

et je comprends pas bien ce qu'il veut… Si quelqu'un peux m'expliquer, merci d'avance :D

  • # Déclaration/Implémentation

    Posté par  . Évalué à 2. Dernière modification le 03 juillet 2021 à 16:59.

    Ici, ton

        class C {
            A a;
            B b(&a);
        };

    est une déclaration de classe et «a» et «b» sont des membres de C. Il n'est donc pas possible de définir leur comportement tout de suite. Le compilo s'attend à un truc du genre:

        class C {
            A a;
            B b;
            C():b(&a) {
               // faire un truc ici
               B b2(&a); // ceci marche aussi ici
            }
        };
  • # Que prend la méthode?

    Posté par  . Évalué à 2.

    Je comprends que tu déclares donc une méthode C::b qui renvoie un B et qui prend un argument nommé a, référence vers un type non fourni ?

    Si tu veux dire que ta méthode C::b prend un argument de type référence vers un A, alors la modification ci-dessous s'impose.

    class C {
        A a;
        B b(A&a);
    };

    Ce code compile, mais l'édition des liens n'est pas garantie (C::b n'est pas définie).
    Et ce n'est pas non plus ce que tu cherches à faire; mais ça, c'est un autre histoire !

  • # non-static data member with initializer (C++11)

    Posté par  (site web personnel) . Évalué à 2.

    https://en.cppreference.com/w/cpp/language/class

    Ce qui me semble pouvoir être le plus proche de ton code…

    #include <iostream>
    
    class A
    {
        public:
            int i = 5;
    };
    
    class B
    {
        public:
            B( A* a )
            : pa(a)
            {;}
    
            A * pa;
    };
    
    class C
    {
        public:
            B b = B(&a);
    
        private:
            A a;
    };
    
    int main()
    {
        C c;
    
        std::cout << c.b.pa->i << std::endl;
    }

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.