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 signature d'une fonction


Sujet :

C++

  1. #1
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut Problème de signature d'une fonction
    Bonjour,

    Je tente de déclarer une fonction prenant des paramètres différents en entrée. Elle a donc plusieurs signatures différentes. Le problème, c'est qu'il arrive au compilateur de choisir la mauvaise fonction :

    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
    //fichier.cpp
    #include "myWideString.h"
    #include "fichier.h" // contient toutes les déclarations 
     
    void function(MyWideString str, bool b)
    {
    	std::cout << str;
    	std::cout << b;
    }
     
    void function(MyWideString str, MyWideString str2)
    {
    	std::cout << str;
    	std::cout << str2;
    }
     
    void run()
    {
    	MyWideString str = MyWideString("Coucou");
    	MyWideString str2 = L"Salut";
    	function(str, str2); // Appelle void function(MyWideString str, bool b)
    }
    Ici, l'appel à function(str, str2) dans la fonction run est erroné, ce qui m'embête beaucoup. À part caster str2 en MyWideString je ne vois pas ce que je pourrais faire d'autre, et j'avoue que cette solution peu élégante ne me satisfait pas. Comment forcer le programme à choisir la fonction possédant la bonne signature ?

    Merci d'avance pour vos réponses.

  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
    Que contiennent myWideString.h et fichier.h?
    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 chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour

    Donne-nous le type complet de MyWideString (c'est un char * ?).
    Tu as d'autres solutions que le cast, par exemple renommer la fonction ou faire un tag dispatch.
    Et dans ce cas particulier, pourquoi ne pas utiliser std::wstring (pour la compatibilité C, il y une fonction membre .c_str()) ?

    Edit suite au message leternel (merci).

  4. #4
    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
    En fait, ça serait plutôt std::wstring, c'est à dire std::basic_string<wchar_t>
    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

  5. #5
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Bonjour

    Donne-nous le type complet de MyWideString (c'est un char * ?).
    Tu as d'autres solutions que le cast, par exemple renommer la fonction ou faire un tag dispatch.
    Et dans ce cas particulier, pourquoi ne pas utiliser std::wstring (pour la compatibilité C, il y une fonction membre .c_str()) ?

    Edit suite au message leternel (merci).
    Bonjour,

    Pour répondre à leternel :

    - fichier.h contient les déclarations de mes fonctions :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //fichier.h
    void function(MyWideString, bool);
    void function(MyWideString, MyWideString);
    void run();

    - myWideString.h contient un type équivalent à std::wstring, mais il est personnalisé pour être portable partout, même sur Windows Phone (d'après ce que j'ai compris de l'entreprise dans laquelle je fais mon stage et qui a développé cette MyWideString).

    Il est vrai que j'aurais pu encapsuler tout cela dans des classes mais je m'étais dit que c'était suffisant pour exprimer mon problème...

    Pour répondre à Ehonn :

    Il est vrai que je n'avais pas pensé au tag dispatching. Bonne idée ! Je pense que je vais l'utiliser parce que ce n'est pas la première fois que ce problème ce pose, et je doute d'avoir une réponse qui me satisfasse. Je ne peux ni utiliser std::string, ni std::wstring car le premier type ne prend pas en compte les caractères Unicode étendu, ce qui doit être le cas dans mon projet, et parce que le second n'est pas portable (pas compatible avec tous les OS). L'entreprise impose l'utilisation de MyWideString.

    En tout cas, merci à vous deux pour vos réponses. Je vais utiliser le tag dispatching, sauf si quelqu'un a une idée de dernière minute !

  6. #6
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    La spécialisation ne devrait pas échouer.
    As-tu un code minimal qui reproduit l'erreur (avec une fausse classe MyWideString) ?

    PS : std::wstring est portable car normalisé (mais tu as, peut-être, besoin d'une fonctionnalité non garantie dans la norme (?)).

  7. #7
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut
    Malheureusement non... Je n'ai pas de code minimal reproduisant l'erreur puisque ce problème n'est survenu qu'après l'utilisation de MyWideString. Il n'y a aucun problème pour l'utilisation d'autres types, mais je vais utiliser tes méthodes dans le cas où un des paramètres est un MyWideString...

  8. #8
    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
    Ce qu'on veut dire par là, c'est deux fonctions, un main qui va bien, et une version réduite de myWideString.
    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

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Hello,

    MyWideString est une vraie class ou un typedef ?
    Si c'est une class, a-t-elle un operator bool ? qui servirait à du cast.

    Pourquoi ne pas passer en paramètre des const MyWideString& ou MyWideString& ?
    Ca pourrait éviter un cast ninja et choisir la bonne méthode.
    En dernier recours, essaye de simplement changer l'ordre de déclaration des méthodes (mettre la méthode avec les 2 MyWideString& en premier dans le h/cpp), possible que ça joue.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    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
    L'ordre non, pas dans la résolution des surcharges (dans celle des spécialisations de template oui, mais ce n'est pas le sujet)

    Par contre, fait attention aux namespace, ça peut être traître. Dans certaines conditions, certaines surcharges ne sont pas prises en compte.
    Pour le détail, il faudrait que je retourne dans la norme
    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

Discussions similaires

  1. Problème d'execution d'une fonction
    Par 12_darte_12 dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 17/03/2006, 11h37
  2. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50
  3. Réponses: 7
    Dernier message: 12/03/2006, 21h18
  4. Problème de signature d'une assembly
    Par lapec_and_cie dans le forum Delphi .NET
    Réponses: 5
    Dernier message: 23/01/2006, 12h31
  5. Signature d'une fonction sans argument
    Par cj227854 dans le forum C++
    Réponses: 5
    Dernier message: 20/10/2005, 17h01

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