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 namespace + problème stringstream


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut Problème de namespace + problème stringstream
    Bonjour,

    J'ai actuellement un namespace Utils avec des fonctions toutes seules.

    En particulier, j'ai cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <typename T> T from_string (string & str, bool convert = false)
    	{
    		istringstream iss (str);
    		T t;
     
    		convert ? (iss >> hex >> t) : (iss >> t);
    		return t;
    	}
    Qui fonctionne très bien.
    Pourtant, dans une de mes classes, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int state = Utils::from_string<int>(str.substr(2));
    Et là c'est le drame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: no matching function for call to 'from_string(std::string, bool)'
    Comment peut-il ignorer le Utils:: juste devant ?

    Deuxième problème, voici une classe toute bête :

    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
    class Packet
    {
    	public:
    		explicit Packet (string packet) { _stream << packet; }
     
    		template<class T> Packet & operator<< (T val)
    		{
    			_stream << val;
    			return *this;
    		}
     
    		string to_string () const { return _stream.str(); }
     
    	private:
    		std::ostringstream _stream;
    };
    J'ai les erreurs suivantes lorsque je veux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fonction(Packet ("XX"));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ios_base.h|790|error: 'std::ios_base::ios_base(const std::ios_base&)' is private|
    iosfwd|47|error: within this context|
    iosfwd|71|note: synthesized method 'std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)' first required here |
    streambuf|770|error: 'std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]' is private|
    iosfwd|63|error: within this context|
    note: synthesized method 'Packet::Packet(const Packet&)' first required here | <== lorsque je fais comme le code juste au-dessus
    Très franchement je suis un peu paumé, après avoir essayé des tas de trucs.

    Une idée ?

  2. #2
    Membre chevronné

    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
    Par défaut
    Salut,

    Pour le premier bug, c'est normal! Tu appelles la fonction from_string avec le seul argument string alors que la fonction prends un string et un bool en argument : Le message d'erreur est explicite.

    Pour le deuxième bug : Sans certitude aucune : tu devrais essayer d'implémenter le constructeur de recopie de ta classe Packet car je crois que l'objet est copié dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fonction(Packet ("XX"));
    ça vient peut-être de là ( mais je répète que c'est sans certitudes )

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut
    J'ai mis le booléen en paramètre facultatif, donc je n'ai pas besoin de préciser le false (d'ailleurs même dans une autre fonction de la même classe, je précise un true mais l'erreur est toujours là).

    J'ai vérifié, mais quoi qu'il en soit le message d'erreur ne prend pas en compte mon Utils::, d'où le problème.

    Pour le constructeur de copie, j'ai tenté quelque chose de ce style-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Packet (const Packet & packet)
    {
    	this->_stream << packet.to_string();
    }
    Et je perds l'erreur, merci (bien qu'avec g++ on sait jamais si ça va pas réapparaitre lol).

    Pour en revenir au namespace, ce n'est pas le premier endroit où j'utilise cette notation, mais il n'y a que dans cette classe en particulier que ça pose problème.

  4. #4
    Membre chevronné

    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
    Par défaut
    Désolé, je n'avais pas vu le = false

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut
    J'ai fait un petit test : j'ai ajouté la fonction dans le corps de la classe pour voir ce qu'il se passait.

    Résultat : toujours la même erreur ! J'ai donc compris que le compilo cherche dans la classe une fonction normale, alors que la mienne est un template et qu'en plus elle est dans un namespace.

    EDIT : J'ai a moitié résolu mon problème ... Explications :

    Ce code-ci ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int result = Utils::from_string<int> (str.substr(2));
    Alors que ceci marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string src = str.substr(2);
    int result = Utils::from_string<int> (src);
    Par contre impossible de savoir pourquoi ce comportement :/

  6. #6
    Membre chevronné

    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
    Par défaut
    Sous VS2008 ce code compile et s’exécute sans plantage :
    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
    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
     
    namespace Utils {
    	template <typename T> T from_string (string & str, bool convert = false) {
    		istringstream iss (str);
    		T t;
    		convert ? (iss >> hex >> t) : (iss >> t);
    		return t;
    	}
    }
     
    class A {
    public:
    	int test () {
    		string str ( "azerty" );
    		int state = Utils::from_string<int>(str.substr(2));
    		return state;
    	}
    };
     
    void main () {
    	string str = "abcdefghijkl";
    	int state = Utils::from_string<int>(str.substr(2));
    	cout << state << endl;
     
    	A a;
    	state = a.test();
    	cout << state << endl;
     
    	system ("pause");
    }

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut
    Apparemment VSC est moins regardant sur la syntaxe que g++ ...

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Nous n'avons toujours pas d'explication, donc.

  9. #9
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par oodini Voir le message
    Nous n'avons toujours pas d'explication, donc.
    Oh mais si : from_string<>() prends une référence sur un objet string, alors qu'il devrait prendre une référence constante. Certaines version de Visual C++ sont capables de créer en temporaire dans ce cas, empêchant la norme de tourner très rond, et empêchant la découverte de l'erreur, parce que le paramètre n'est pas modifié dans la fonction.

    Regarde le message d'erreur exact :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error: no matching function for call to 'from_string(std::string, bool)'
    Le problème n'est pas qu'il ne trouve pas de fonction from_string dans Utils, mais il ne trouve pas la bonne, va que la seule qu'il ait a pour signature

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from_string(std::string&, bool)
    Par contre, avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from_string(const std::string&, bool)
    Ca va marcher tout seul.

    Pourquoi est-ce qu'en passant par une variable temporaire, ça marche ? Pour la même raison : tu peux prendre la référence non-const de la variable temporaire, mais tu n'aura pas de référence non-const sur la valeur de retour d'une fonction.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. [XSLT]Problème de namespace sur un export XMi (UML 2.1/XMi 2.1)
    Par CocoRambo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 25/06/2007, 09h50
  2. problème de namespace
    Par deubelte dans le forum C++
    Réponses: 10
    Dernier message: 30/05/2007, 12h48
  3. [C#/.NET 2.0] Problème de namespace/référence
    Par Tetram165 dans le forum Services Web
    Réponses: 2
    Dernier message: 05/01/2007, 01h55
  4. [XSD] Problème de namespace
    Par pierrelm dans le forum Valider
    Réponses: 3
    Dernier message: 14/09/2006, 01h19
  5. [DOM] Problème de namespace
    Par dauggui dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 26/04/2006, 07h22

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