Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Template avec surcharge d'opérateurs [ Archives / Au secours ] (benjiiim94)

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é 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 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 probleme de map erreur de link [ par hisoka56 ] Bonjour, j'ai un problème de link: Linking... edition.obj : error LNK2019: unresolved external symbol __imp___CrtDbgReportW referenced in .... Cela C'est ça un template ??? [ par wismerhill__ ] Bonjour, j'ai un probleme que je pense etre simple mais bon ...J'ai une classe A dont un attribut est actuelement un std::vectorUne classe B mere de C


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.