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

Linux Discussion :

Erreur template parameters lors du portage vers le gcc 4.4


Sujet :

Linux

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Erreur template parameters lors du portage vers le gcc 4.4
    Bonjour à tous,
    je traville sur une bibliothèque compilée avec le gcc4.0 et les version précédentes. je veux insérer les directives openmp dans le code source de cette bibliothèque. Donc j'ai compilé le code avec la version gcc4.4 puisque openmp n'est reconnu qu'a partir de la version 4.2, mais dans ce cas j'obtient bcp d'erreurs surtout au niveau de la définiton des templates. Donc je savoir qu'elle est la différence entre ces versions du gcc et y a il un moyen qui assure le portage des programmes compilés avec les anciennes versions vers les versions récentes du gcc. Voici ci dessous une partie du code et les erreurs obtenues lors de la compilation.

    ifndef _PAT_FAM
    #define _PAT_FAM

    #include <iostream>
    #include <vector>


    template<typename P, template<typename T> class ST>
    class pat_fam;
    template<typename P, template<typename T> class ST>
    std::ostream& operator<< (std::ostream&, const pat_fam<P, ST>&);


    template<typename P, template<typename T> class ST=std::vector>
    class pat_fam: public ST<P*>
    {
    public:
    typedef typename ST<P*>::iterator IT;
    typedef typename ST<P*>::const_iterator CONST_IT;


    friend std::ostream& operator<< <>(std::ostream&, const pat_fam<P, ST>&);
    };

    template<class P>
    std::ostream& operator<< (std::ostream& ostr, const pat_fam<P, std::vector>& pats)
    {
    typename pat_fam<P, std::vector>::CONST_IT it;
    for(it=pats.begin(); it!=pats.end(); it++)
    ostr<<*it<<std::endl;
    return ostr;
    }

    #endif



    pat_fam.h:57: erreur: type/value mismatch at argument 2 in template parameter list for ‘template<class P, template<class T> class ST> class pat_fam’
    pat_fam.h:57: erreur: expected a template of type ‘template<class T> class ST’, got ‘template<class _Tp, class _Alloc> class std::vector’
    pat_fam.h: In function ‘std::ostream& operator<<(std::ostream&, const int&)’:
    pat_fam.h:59: erreur: type/value mismatch at argument 2 in template parameter list for ‘template<class P, template<class T> class ST> class pat_fam’
    pat_fam.h:59: erreur: expected a template of type ‘template<class T> class ST’, got ‘template<class _Tp, class _Alloc> class std::vector’
    pat_fam.h:59: erreur: invalid type in declaration before ‘;’ token
    pat_fam.h:60: erreur: request for member ‘begin’ in ‘pats’, which is of non-class type ‘const int’
    pat_fam.h:60: erreur: request for member ‘end’ in ‘pats’, which is of non-class type ‘const int’
    pat_fam.h:61: erreur: invalid type argument of ‘unary *’


    Le même code est compilé sans erreur avec g++3.4
    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Tu aurais du poster en C++, c'est vraiment en problème de C++ plus que de g++. Pense à la balise code aussi (le # quand tu écris le message)

    Sinon vite fait:
    Ton paramètre template ST est déclaré comme classe template à 1 argument.
    Or la classe vecteur en a 2. Si on ne le voit pas, c'est car ce dernier à une valeur par défaut. Mais pour passer std::vecteur à ta classe, il faut que ton paramètre template prenne 2 arguments. Après, pour éviter les problèmes chianuyeux, il faut aussi lui donner la valeur par défaut qu'elle a (std::allocator<T> ).

    J'arrive au code suivant:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    template<typename P, template <typename,class A=std::allocator<P> > class ST>
    class pat_fam;
     
    template<typename P, template<typename,class A=std::allocator<P> > class ST>
    std::ostream& operator<< (std::ostream&, const pat_fam<P, ST>&);
     
     
    template<typename P, template<typename,class A=std::allocator<P> >  class ST>
    class pat_fam: public ST<P*>
    {
    public:
        typedef typename ST<P*>::iterator IT;
        typedef typename ST<P*>::const_iterator CONST_IT;
     
    friend std::ostream& operator<< <>(std::ostream&, const pat_fam<P, ST>&);
    };
     
    template<class P, template<typename,class A=std::allocator<P> > class ST>
    std::ostream& operator<< (std::ostream& ostr, const pat_fam<P, ST >& pats)
    {
        typename pat_fam<P, ST>::CONST_IT it;
        for(it=pats.begin(); it!=pats.end(); it++)
     
    //<-- il manque un déférencement, sinon tu affichais l'adresse.
        ostr<<**it<<std::endl; 
     
    return ostr;
    }
     
    int main(int argc, char const *argv[])
    {
        pat_fam<int,std::vector > p;
        p.push_back(new int(5));
        std::cout<<p;
        return 0;
    }
    Encore quelques remarques en vrac:
    Il ne faut pas hériter d'un conteneur standard de manière publique: il ne sont pas fait pour (pas de destructeur virtuel).

    Le système mis en place ici ne marchera que pour un conteneur à 2 paramètres. Autrement dit, pour une liste ca ne compilera pas.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. [2.x] Curieuse erreur lors du passage vers v2.1
    Par Francesco34 dans le forum Symfony
    Réponses: 0
    Dernier message: 25/07/2012, 10h18
  2. erreur lors du tranfert vers excel ?
    Par delphino7 dans le forum Débuter
    Réponses: 2
    Dernier message: 11/04/2010, 17h12
  3. [XL-2003] Erreur lors du publipostage vers word
    Par jacda dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/01/2010, 21h03
  4. Code Igniter Intercepter les erreurs lors des requêtes vers bases de données
    Par ilalaina dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 06/10/2009, 07h52
  5. Erreur lors du post vers la meme page!
    Par ozzmax dans le forum Langage
    Réponses: 10
    Dernier message: 23/01/2006, 19h16

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