begin process at 2010 02 10 02:43:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Template avec surcharge d'opérateurs


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Template avec surcharge d'opérateurs

jeudi 11 mai 2006 à 20:25:22 | Template avec surcharge d'opérateurs

benjiiim94

Membre Club
    Bonjour,

J'essaie déséspéremment de créer une petite classe pour me familiariser avec les templates. Non sans mal j'ai obtenu un résultat pas mal jusqu'à ce que j'essaie de surcharger un opérateur.
Voici le code que j'utilise :


#pragma once
#include "StdAfx.h"

using namespace std;

template <class T>
class Point
{
    T x;
    T y;
public:
    Point(void);
    ~Point(void);

    void affich();
    void set(T, T);

    friend ostream& operator<<(ostream &, const Point<T> &);
};

template <class T> Point<T>::Point(void)
{
    std::cout << "on entre dans le constructeur" << std::endl;
}

template <class T> Point<T>::~Point(void)
{
    std::cout << "on entre dans le destructeur" << std::endl;
}

template <class T> void Point<T>::affich()
{
    std::cout << "On affiche " << this->x << ", " << this->y << std::endl;
}

template <class T> void Point<T>::set(T x, T y)
{
    this->x = x;
    this->y = y;
}

template <class T> ostream& operator<<(ostream &os, const Point<T> &p)
{
    os << "affichage" << std::endl;

    return os;
}



Et là Visual Studio me donne l'erreur suivante quand j'utilise cet opérateur :

Error    1    error LNK2001: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Point<double> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Point@N@@@Z)    Test_Template.obj



J'éspère qu'il ne s'agit pas d'une erreur stupide...

Merci beaucoup de votre aide
jeudi 11 mai 2006 à 22:03:56 | Re : Template avec surcharge d'opérateurs

Taron31

Membre Club
En effet, par exemple le code suivant :

#include <iostream>

using namespace std;

template<class T>
class Point {

    friend ostream& operator<<(ostream&, const Point<T>);

public:
    Point();
   
    int Num;
};

template<class T>
Point<T>::Point()
{
}

template<class T>
ostream& operator<<(ostream &os, const Point<T> p)
{
    cout << "operator<< called !\n"
        << "Point::Num is " << p.Num << "\n";

    return os;
}

int main()
{
    Point<char> p;
    p.Num = 69;

    cout << p;

    return 0;
}

Compile parfaitement sous VC++ 6.0 mais pas pour VC++ Express 2005 ; il y'a une erreur de link... je serais aps dire pourquoi et ça m'intéresserait de savoir...

___________________
MVS
- Most Valuable Student (Microsoft)
jeudi 11 mai 2006 à 23:10:28 | Re : Template avec surcharge d'opérateurs

Hylvenir

Réponse acceptée !
Salut,

le problème que vous rencontré est connu sous le nom de 'Friend Name Injection'
Il vient de la déclation de la fonction friend.
4 solutions possibles :
1- Supprimer la déclaration du friend
2- Mettre la définition de l'operator << au même endroit que sa déclaration (dans la classe)
3- Utiliser ce qui s'appelle le 'Barton-Nackman Trick'
4- Changer le C++ ( http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/1995/N0777.pdf ) ;)

Voilà tout ce dont je sais sur ce sujet.
Je crois que vous êtes tombés sur un sujet compliqué...
Bon courage ;)

// Ma participation à la saturation du net: http://hylvenir.free.fr
vendredi 12 mai 2006 à 00:00:38 | Re : Template avec surcharge d'opérateurs

benjiiim94

Membre Club
Merci, Je n'ai malheuresement pas le temps de comprendre plus en détail le problème pour l'instant, je me suis contenté de mettre la définition de l'opérateur avec sa déclaration et c'est ok ! :p Merci beaucoup pour ces solutions !


Cette discussion est classée dans : class, void, template, std, ostream


Répondre à ce message

Sujets en rapport avec ce message

virtual template [ par Guillemouze ] Salut, je voudrais savoir si il est possible de faire des fonctions virtuelles template. voici mon cas : class Type {     void toto(int i) {} }; clas template rendre friend un operator<< [ par littlenemo ] Hello world !!Un petit merci a tout ce qui me lirons et peut etre un grand a celui qui me donne ma reponce.Alors je vous mets dans le bain:Je doit cod class template ;surcharge operator << >> [ par lui88 ] Bonjour , aprés plusieurs forum je n'arrive toujours pas a reglé mon probleme le programme fonctionnais sur Visual V6 je le migre sous visual studio 2 Spécialisation des template [ par lglandeur ] Bonjour,J'ai une fonction template qui appartiens a une class (qui n'est pas template), et je souhaite spécialiser cette fonction pour le type std ::s La class string [ par jderf ] Je suis débutant et je teste la class string. Voici un code tous simple, mais y'a un probleme de conversion à la compil que je ne comprend pas. Les er héritage & template [ par rolm ] Bonjour, J'aurai besoin d'un peu avec des tempates. En fait je voudrais créer une class qui hérite d'une class template mais d'un type donné. par e arbrebinaire [ par jbitsch68 ] bonjour, j'essaye de créer un arbre binaire. voici le code : --- les classes noeud et arbrebinaire [code=cpp]#include class Noeud; class Arbr Probleme d'heritage [ par bakibak ] Bonjour a tous, je suis en train de coder un projet pour la gestion d'un zoo a la fac.Sans tout vous décrire j'ai une classe personne et deux classe h Erreur de linkage - de vc++98 a vc++2008 [ par pepsidrinker ] Bonjour a tous, merci de lire ce post. Jai un petit probleme de linkage: Jai un programme c++ (pure et dure, pas de MFC ni de .NET), que jai developpe Shared Library [ par omarlahlou ] Bonjour tout le monde, <p class="MsoN


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales