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

Langage C++ Discussion :

Abstraction, Template & operateur


Sujet :

Langage C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut Abstraction, Template & operateur
    bonjour,

    j'ai la structure suivante
    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
    class AcquisitionBase  {
    private:
    double value;
    public:
    virtual string toString() = 0;
    virtual double getInvariantValue() = 0;
    }
     
    template<typename T>
    class Acquisition: public AcquisitionBase{
    private:
    T v;
    public:
    Acquisition(T vlaue) : v(value) {
    }
    virtual string toString() {
        return "information";
    }
    virtual double getInvariantValue() {
        return (double)v;
    }
    }
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef float ANALOG;  		
    typedef unsigned short DIGITAL; 
    typedef bool LOGIC;
    et je veux implémenter l’opérateur + (par exemple mais en fait je vais les faires tous) pour faire des calcul avec
    Acquisition<ANALOG> + Acquisition<DIGITAL> etc ....

    donc dans le template j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    virtual Acquisition<T> operator+(AcquisitionBase &ob) {
    	return Acquisition<T>(
    		this->getInvariantValue() + ob.getInvariantValue());
    }
    mais j'ai l'erreur suivante quand je rajoute l’opérateur pour les littéraux (dont j'ai aussi besoin évidement pour faire Acquisition<ANALOG> + 21)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T>
    Acquisition<T> operator+(Acquisition<T> &ref, int ob) {
    	return Acquisition<T>(ref.getInvariantValue() + ob);
    }
    ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

    étonnamment quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T>
    Acquisition<T> operator+(int ob) {
    	return Acquisition<T>(this->getInvariantValue() + ob);
    }
    je n'ai pas d'erreur, mais si j'ai mis un opérateur externe c'est pour résoudre les deux cas
    • Acquisition<ANALOG> +21
    • 21 + Acquisition<ANALOG>


    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T>
    Acquisition<T> operator+(int ob, Acquisition<T> &ref) {
    	return ref + ob;
    }
    bref avez vous une solution pour
    • soit éviter d'afficher cette erreur (je suis sur linux avec g++ 4.4.6)
    • soit changer la structure


    merci et bonne soirée de Noël a vous tous....

    NOTA : sur visual studio 2013 j'ai pas d'erreurs
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Quelque chose me choque dès le départ.
    Dans AcquisitionBase, il y a un double (value) privé, sans accesseur aucun, ni constructeur.
    C'est une variable perdue.

    Si je résume, tu veux que tes classes Acquisition<T> aie toute une toString() et une getInvariantValue().

    Et tu veux que pour tout T1 et T2, operator +(Acquisition<T1>, Acquisition<T2>) retourne la somme des getInvariantValue()?
    De plus, tu veux aussi pouvoir utiliser un nombre dans la somme?

    L'idée de l'opérateur implémenté en fonction libre est qu'il peut être appelé via une conversion du premier argument, alors que ce n'est pas le cas de la fonction membre.
    Pour cela il faut une opération de conversion, c'est à dire un constructeur implicite.


    Sauf qu'ici, tu auras plusieurs conversions possible, et que 12 n'est pas une acquisition, mais juste 12.

    Et si tu prenais le problème à contrepied?
    Les nombres ont tous les opérateurs mathématiques prédéfinis, il suffirait d'avoir une opération de conversion vers les nombres.

    Que penses-tu de ceci?
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <iostream>
     
    namespace data{
     
    typedef float ANALOG;  		
    typedef unsigned short DIGITAL; 
    typedef bool LOGIC;
     
    class AcquisitionBase  {
    protected:
    	~AcquisitionBase(){}
    public:
    	virtual std::string toString() const = 0;
    	virtual double getInvariantValue() const = 0;
     
    };
     
    template<typename T>
    class Acquisition: public AcquisitionBase{
    private:
    	T v;
    public:
    	explicit Acquisition(T value) : v(value) {}
     
    	virtual std::string toString() const {
    		return "information";
    	}
     
    	virtual double getInvariantValue() const {
    		return (double)v;
    	}
     
    	//conversion template
    	operator T() const {return v;}
    };
     
    };//data::
     
    using namespace data;
     
    int main() {
    	Acquisition<DIGITAL> digit(7);
    	Acquisition<ANALOG> analog(12);
     
    	std::cout << "digit + :" << (digit + 4.1) << std::endl;
    	std::cout << "+ digit :" << (4.1 + digit) << std::endl;
    	std::cout << "analog +:" << (analog + 3) << std::endl;
    	std::cout << "+ analog:" << (3 + analog) << std::endl;
    	std::cout << "somme   :" << (digit + analog) << std::endl;
    	std::cout << "produit :" << (digit * analog) << std::endl;
    }
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    Citation Envoyé par leternel Voir le message
    Quelque chose me choque dès le départ.
    Dans AcquisitionBase, il y a un double (value) privé, sans accesseur aucun, ni constructeur.
    C'est une variable perdue.
    oui je sais elle n'a aucune importance c’était résiduel lol

    pour le reste ton idée est séduisante mais pour l'exemple j'ai botté en touche que la classe AcquisitionBase possède aussi une validité ca donne ca en réel et que cette validité doit être préservée pour les calculs ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class AcquisitionBase: public IObjectType<AcquisitionBase>,
    		public IToString,
    		public IType,
    		public IValidity { ... }
     
    template<typename T>
    class Acquisition: public AcquisitionBase, public Value<T> { ... }
    si tu veux ce que je comprend pas c'est pourquoi avec g++ ca me colle une tartine de warning et sur visual studio tres peut
    en fait visual studio me dit juste que ANA en double je risque de perdre des choses ....
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Concernant les warnings, j'imagine que le niveau de warning par défaut n'est pas le même dans vs et dans gcc.
    Dans vs, tu peux le régler dans les propriétés du projet -> C/C++ -> general -> warning level
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    dans eclipse je trouve un trucs dans code analysis mais c pas vraiment clair
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    As-tu lu cet article ?

    Apparemment, tu ne nous donnes pas la totalité du message d'erreur.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    voici les messages que j'ai

    candidate 1: cy::ln2_type::Acquisition<T> cy::ln2_type::Acquisition<T>::operator+(cy::ln2_type::AcquisitionBase&) [with T = float]
    candidate 2: cy::ln2_type::Acquisition<T> cy::ln2_type::operator+(double, cy::ln2_type::Acquisition<T>&) [with T = float]

    j'ai tenté de mettre le constructeur en explicit mais sans resultat
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Apparemment, il hésite entre l"opérateur unaire et binaire.
    Il faut choisir, camarade. Avec une forte préférence pour l'opérateur binaire.

Discussions similaires

  1. Template, et operateur surchargés !
    Par DakM dans le forum Langage
    Réponses: 14
    Dernier message: 17/11/2011, 17h23
  2. Réponses: 22
    Dernier message: 17/07/2008, 09h51
  3. Optimisation Listechainé avec template et operateur surchargé.
    Par Alain Defrance dans le forum Langage
    Réponses: 8
    Dernier message: 29/12/2007, 18h25
  4. Réponses: 6
    Dernier message: 12/07/2007, 18h18
  5. [Template] Surcharge operateur
    Par juls64 dans le forum C++
    Réponses: 7
    Dernier message: 04/05/2007, 19h35

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