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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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");
    }

+ 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