begin process at 2012 02 10 13:56:37
  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 [Winform c++] Problème utilisation de class [ par nico77580 ] Bonjour, Je suis en 2ème année de BTS IRIS et je dois faire un projet permettant de contrôler un robot. J'ai réussi a faire des Thread, des boutons et 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 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

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 : 5,304 sec (3)

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