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 de spécialisation partielle


Sujet :

C++

  1. #1
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut Problème de spécialisation partielle
    Bonjour,

    je n'arrive pas à spécialiser l'une de mes fonctions membres dans ma classe Vector. Je dispose de deux structures pour spécifier le format dense ou creux d'un Vector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template<typename precision> struct dense
    {
        size_t len_;
        precision* val_;
    };
    template<typename precision> struct sparse
    {
        size_t len_;
        size_t nnz_;
        size_t *ind_;
        precision* nzval_;
    };
    La classe Vector proprement dite ressemble à ceci (sans les méthodes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<template<typename T>class format,typename precision>class Vector : format<precision>
    {
    public:
         precision const sum()const;
    };
    Le problème vient de la fonction sum() qui est censée me retourner la somme des éléments d'un Vector. Elle n'est pas implémentée de la même manière selon que le format est dense ou creux, donc j'ai tenté une spécialisation partielle pour le format creux :
    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
    template<template<typename T>class format,typename precision> precision const Vector<format,precision>::sum()const
    {
        precision output = 0;
        for (size_t i=0;i<len_;++i)
            output += val_[i];
        return output;
    }
     
    template<typename precision> precision const Vector<sparse,precision>::sum()const
    {
        precision output = 0;
        for (size_t i=0;i<nnz_;++i)
            output += nzval_[i];
        return output;
    }
    Malheureusement, ça ne compile pas parce que la spécialisation n'est pas reconnue en tant que telle. Quelqu'un saurait-il pourquoi?

    Merci pour votre aide.

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Tu as bien spécialisé partiellement la classe et non directement la fonction membre ?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Non, j'ai spécialisé la fonction membre. Je suis obligé de spécialiser la classe? Ce que tu entends par spécialiser la classe, c'est bien ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template<template<typename T>class format,typename precision>class Vector : format<precision>;
     
    template<typename precision>class Vector : dense<precision>
    {
    public:
        precision const sum()const;
    };
     
    template<typename precision>class Vector : sparse<precision>
    {
    public:
        precision const sum()const;
    };

  4. #4
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    On n'a pas le droit de spécialiser partiellement les fonctions, c'est juste pour les classes.

    Tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<class>
    struct A
    { void foo(); };
     
    //spécialisation totale
    template<>
    void A<int>::foo(){};
    Mais pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<class T>
    void A<T*>::foo(){};
    La solution c'est donc de spécialiser partiellement la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<class T>
    struct A<T*>
    { void foo(); };
     
    template<class T>
    void A<T*>::foo(){}
    NB: Les codes sont tapées sans avoir été testé, il peut rester des erreurs de syntaxe, mais l'idée est là.

  5. #5
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Salut,
    J'ai eu le même pb il y a quelques jours, il y a des infos détaillées .

  6. #6
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Merci à vous deux!

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

Discussions similaires

  1. Problème de spécialisation de fonction template membre
    Par Davidbrcz dans le forum Langage
    Réponses: 4
    Dernier message: 29/12/2007, 20h01
  2. Problème de lecture partielle d'un fichier
    Par erloroloco dans le forum Fortran
    Réponses: 3
    Dernier message: 01/12/2007, 13h27
  3. Problème de spécialisation de fonction membres template
    Par ludovic.barrillie dans le forum Langage
    Réponses: 3
    Dernier message: 17/04/2007, 08h44
  4. Réponses: 1
    Dernier message: 13/09/2006, 16h10
  5. Réponses: 4
    Dernier message: 29/01/2006, 17h54

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