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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    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 éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    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 éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    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 confirmé 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
    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