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 :

Portage sous Linux et g++ tatillon


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Portage sous Linux et g++ tatillon
    Bonjour à tous,

    Je suis en train de porter des bibliothèques sous Linux (g++), que j'avais développé sous Windows (MSVC).

    Un des problèmes récurrent que je rencontre avec g++, est qu'il vérifie le corps d'une fonction template avant son utilisation.

    Par exemple (à la main juste pour expliciter le phénomène) :
    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
     
    // a.h
    class A
    {
    public:
       static void SomeMethod(int i);
    };
     
    // b.h
    template<int I> void ExecSomeMethod()
    {
        A::SomeMethod(I);
    }
     
    // c.h
    ExecSomeMethod<3>();
    Sous Windows, la vérification de la méthode template sera faire lors de son instanciation. Il sera donc possible de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "b.h" // erreur avec g++
    #include "a.h"
    ExecSomeMethod<3>();
    Tandis que g++ lui, lors de la première inclusion "b.h", il va protester comme quoi le symbole "A" n'existe pas..

    Dans mon cas, une bibliothèque essentiellement basée sur la méta programmation, c'est fort problématique.

    Y aurait-il une option à passer à g++ pour ne pas qu'il vérifie le corps des méthodes template avant qu'il ne reçoive les appels avec les paramètres ?

    En vous remerciant par avance,

    A bientôt

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    C'est étrange je trouve, sous Windows il est également censé dire qu'il ne connait pas la définition de A. Inverse tout simplement les includes a.h et b.h

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Apparemment MSVC va vérifier la fonction template que lorsqu'une spécialisation a été appelée, mais pas g++, lui il ne laisse rien passer.

    Pour essayer de simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template<class T> void SomeMethod()
    {
       AClass::Do();
    }
    Lorsque le compilateur va passer dessus, je souhaite qu'il ne vérifie rien jusqu'à tant qu'une spécialisation (dans un .cpp) ne lui soit imposé.

    J'imagine qu'il y a une option dans g++ pour ça, mais laquelle ?

    En tout cas merci pour ta réponse

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Voilà, j'ai reproduit le truc sur un petit fichier :

    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
     
    template<int I>
    class B
    {
    public:
    	static void SomeMethod()
    	{
    		A::SomeMethod();
    	}
    };
     
    class A
    {
    public:
    	static void SomeMethod();
    };
     
    void test()
    {
    	B<3>::SomeMethod();
    }
    Sous Windows ça compile, mais sous linux avec la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g++ -o test.o -c test.cpp
    J'obtiens une erreur :
    test.cpp: In static member function "static void B<I>::SomeMethod()":
    test.cpp:7:3: error: "A" has not been declared
    Ce qui est fort problématique dans un paradigme tel que la méta programmation, où l'on déclare des comportements plutôt que des entités, que l'on viendra concrétiser via l'appel spécialisation des templates..

    J'ai vraiment besoin d'aide là..

  5. #5
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Pourquoi veux tu absolument avoir B avant A? Template ou pas, il faut respecter une certaine logique, lorsque tu fais une classe A qui a besoin de B, tu déclare B avant A. Tu utilises une fonction statique, c'est donc la règle de compilation relative au fonction statique qui s'applique et pas à la classe template. Ton template n'a rien à voir dans ton problème ici.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    C'est compliqué à expliquer. Il faut savoir que nous ne sommes pas dans un paradigme traditionnel, mais dans celui de la méta programmation. Actuellement je possède une bibliothèque statique, à niveau abstrait, "méta" que viendra concrétiser une bibliothèque dynamique, qui elle relève de l'ordre concret.

    Comment faire une analogie (c'est toujours plus explicite..)

    Admettons tu exposes une fonction "je vends <des trucs>". MSVC va dire "tu vends, très bien, mais j'attends de savoir ce que tu va vendre pour te donner mon avis". Ma bibliothèque statique est chargée de vendre.

    Ensuite tu définis "je vends<fraise>, je vends<pomme>, je vends<table>", là il va s'intéresser à ta fonction de vendre des fraises, des pommes et des tables, et non des bananes. Peut-être que la vente de fraises ou de pommes ne lui posera pas de problème au compilateur, mais celle des tables, si ! Toujours est-il qui va attendre un peu de concret pour se prononcer.

    Ça se passe à la compilation, et non à l'exécution.

    Tandis que g++ à la définition de "je vends<des trucs>" il va stopper net avec un message "quoi ?". Mais ça n'est pas le moment de savoir quoi, sache qu'il y a une procédure de vente, et tu l'évalueras le moment venu avec ce qu'il est ordonné de vendre..

    C'est un paradigme inhérent au C++, et j'espère bien que g++ le prenne en compte, mais qu'il faille spécifier des options (que je ne connais pas actuellement) afin que la vérification sémantique soit différée à l'instanciation du modèle plutôt qu'à la rencontre d'un code template dont il ne connait pas le contexte de sa concrétisation.

    Bref, l'exemple précédent, simple, démontre mon problème actuel.. Et j'imagine qu'il y a des options dans g++ pour dire "les templates, ne t'en occupes pas de suite, voit ça à la concrétisation"

    C'est précisément ce que je cherche

    En tout cas merci pour cet échange

Discussions similaires

  1. Portage appels DeviceIoControl windows sous linux
    Par nico2022 dans le forum Linux
    Réponses: 6
    Dernier message: 23/02/2007, 14h18
  2. portage sous linux
    Par rojbi dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 09/11/2006, 13h38
  3. Portage sous linux
    Par rojbi dans le forum Linux
    Réponses: 4
    Dernier message: 19/10/2006, 09h41
  4. Portage d'une application MFC sous Linux/Unix
    Par farscape dans le forum MFC
    Réponses: 29
    Dernier message: 20/02/2006, 17h47
  5. Portage, Librairire de Visual Studio sous Linux ?
    Par HNT dans le forum Visual C++
    Réponses: 9
    Dernier message: 03/02/2006, 23h06

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