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

SL & STL C++ Discussion :

[STL]Afficher une liste de listes avec copy


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 100
    Points
    100
    Par défaut [STL]Afficher une liste de listes avec copy
    Je souhaiterais utiliser la fonction copy pour afficher une liste de listes.

    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
     
    #include <iostream>
    #include <iterator>
    #include <list>
    #include <algorithm>
     
    using namespace std;
     
    typedef list<int> IntList;
    typedef list<IntList> ListList;
     
    ostream& operator<<(ostream& os, const IntList& l) {
    	copy(l.begin(),l.end(),ostream_iterator<int>(cout,"\t"));
    	return os;
    }
     
    int main() {
    	ListList l(2,IntList(2));
    	copy(l.begin(),l.end(),ostream_iterator<IntList>(cout,"\n")); // Erreur de compilation
    	return 0;
    }
    Compilé avec g++ 3.4.2 sous Windows XP, le code ci-dessus génère une masse de messages d'erreurs (en substance : " no match for 'operator<<' " au niveau de l'opérateur 'operator=' de ostream_iterator).

    Qu'est-ce qui ne va pas ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 100
    Points
    100
    Par défaut
    J'ai copié-collé la définition de ostream_iterator présente dans l'en-tête 'stream_iterator.h', et la compilation s'est déroulée sans erreur. La seule différence entre ma source et la définition dans 'stream_iterator.h' était la présence de 'namespace std { }'.

    Voici donc la version corrigée du programme :

    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
     
    #include <iostream>
    #include <iterator>
    #include <list>
    #include <algorithm>
     
    using namespace std;
     
    typedef list<int> IntList;
    typedef list<IntList> ListList;
     
    namespace std {
     
    	ostream& operator<<(ostream& os, IntList const& l) {
    		copy(l.begin(),l.end(),ostream_iterator<int>(cout,"\t"));
    		return os;
    	}
     
    } // namespace std
     
    int main() {
    	ListList l(2,IntList(2));
    	copy(l.begin(),l.end(),ostream_iterator<IntList>(cout,"\n"));
    	return 0;
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 100
    Points
    100
    Par défaut
    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
     
    #include <iostream>
     
    namespace toto {
    	class A {};
     
    	void f(int) { std::cout << "f(int)\n"; }
     
    	template<typename T> void g(const T& t) { f(t); }
    }
     
    using namespace toto;
     
    namespace toto {
    	void f(const A&) { std::cout << "f(const A&)\n"; }
    }
     
    int main() {
    	g(A());
    	return 0;
    }
    Pour que le code ci-dessus compile, il faut soit :
    • qu'aucune fonction f ne soit définie dans toto
    • que toutes les surcharges de f soient définies dans toto

    Je crois que j'ai compris pourquoi.

    Quand le compilateur définit la fonction g<A>(A), il voit que le paramètre de f() appartient au namespace toto et va chercher une définition de f() dans toto. S'il y en a une avec le bon type, ok. S'il y en a mais pas avec le bon type de paramètre, erreur (et pas de recherche ailleurs, d'où le problème avec ostream_iterator). S'il n'y en a pas, il va chercher parmi les fonctions accessibles dans tout le fichier.

    Si quelqu'un pouvait confirmer, ce serait sympa.

  4. #4
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Merci boromir73 pour cette explication.

    Je pense juste que tu as fais une erreur de frappe.
    Citation Envoyé par boromir73
    Quand le compilateur définit la fonction g<A>(A), il voit que le paramètre de f() appartient au namespace toto et va chercher une définition de f() dans toto.
    Je dirais plutôt :
    Quand le compilateur définit la fonction g<A>(A), il voit que le paramètre de g() (c'est-à-dire A) appartient au namespace toto et il va chercher une définition de f() dans toto.

    Citation Envoyé par Bjarne Stroustrup
    A function taking an argument of type T is more often than not defined in the same namespace as
    T Consequently, if a function isn’t found in the context of its use, we look in the namespaces of its T arguments.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/01/2012, 10h28
  2. Réponses: 1
    Dernier message: 17/10/2007, 14h32
  3. afficher une variable ou chaine avec PLPGSQL
    Par doudoudon dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 14/08/2006, 13h46
  4. afficher une suite de liste
    Par bhb010181 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/06/2006, 10h26
  5. Afficher une buffer de pixel avec Direct3D
    Par Black_Daimond dans le forum DirectX
    Réponses: 4
    Dernier message: 27/12/2002, 22h18

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