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

C++ Discussion :

[Visual C++]Sucharge d'operateur ami template & inline -> symbole non resolu


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut [Visual C++]Sucharge d'operateur ami template & inline -> symbole non resolu
    Bonjour,

    Je poste ce petit message car je vient de remarquer un comportement tres étrange du compilateur C++ de VisualStudio 2008...

    Je souhaitais implémenter une petite classe permettant la manipulation de nombres complex et tant qu' a faire, template, histoire de manipuler des Complex<float>, Complex<double> ou bien Complex<long> celons les circonstances.

    Jusque la, pas de problème, je déclare ma classe, mes fonctions, ca compile, le monde est rose, les oiseaux chantent.

    Mais tout bascule quand me vient l'idée d'implémenter une surcharge de l' opérateur << pour std::ostream.

    Je la declare :
    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
     
    template<class T>
    class Complex
    {
    public:
    	Complex(T real = 0, T imag = 0)
    		:_real(real), _imag(imag)
    	{}
    	Complex(Complex<T>& cpy)
    		:_real(cpy._real), _imag(cpy._imag)
    	{}
     
    	inline T& real();
    	inline T& imag();
    	/* ... */
     
    	friend
    	inline std::ostream& operator <<(std::ostream& oss, Complex<T>& c);
     
    private:
    	T _real;
    	T _imag;
    };
    puis je l' implémente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<class T>
    inline std::ostream& operator <<(std::ostream& oss, Complex<T>& c)
    {
    	oss << c._real << " + " << c._imag << "i";
    	return (oss);
    }
    Mais si je souhaite compiler avec une ligne comme std::cout << un_complex; :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error	2	error LNK2019: 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 Complex<float> &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Complex@M@@@Z) referenced in function "public: static int __cdecl Worker::DivIndex(class Complex<float>,float,int)" (?DivIndex@Worker@@SAHV?$Complex@M@@MH@Z)	Work.obj	Mandelbrot
    Si je place l'implémentation dans le corp de ma classe, ça fonctionne.

    J' ai bien trouvé un message qui ressemble :
    http://www.developpez.net/forums/d53...ame-injection/

    Mais je ne parvient pas a comprendre la logique du compilateur pour finalement chercher une fonction qui n'existe pas....
    Si quelqu'un pouvais m'expliquer le pourquoi et le comment cela pourrait éclaircir mes idées.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Tu implémentes bien dans le .hpp? Pas dans un cpp à part?

    Par ailleurs ça manque de const tout ça.

    C'est un exercice? Parce que si c'est pour être utilisé alors autant utilisé la STL qui fournit tout ce qu'il faut dans l'entête de fichier <complex>. (une class complex templaté comme tu veux le faire).

  3. #3
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Wi bon il manque quelques const.
    C'est pour le plaisir que je fait ça.
    Merci pour std::complex, j'avoue que je savais que le C90 implémentais le type complex mais je n'ai pas chercher ce qui existait dans la stl en la matière.

    Mais bon, si je me sert de toute les libs qui existent je ne code plus que 10lignes par programme.

    Et oui, l'implémentation suit les déclarations, puisque si je ne fait pas d'erreur ce même code compile avec G++.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145

  5. #5
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Je ne suis pas sur d'avoir parfaitement tout compris mais merci, ca fonctionne.
    Apparemment il ne comprenais pas que ma fonction étais une fonction template et non une spécialisation pour le type Complex<T>.

    En la déclarant template<class T> et en remplacent Complex<T> par Complex, le compilateur comprend ce que je veux faire

    Merci
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

Discussions similaires

  1. Réponses: 10
    Dernier message: 27/07/2009, 14h31
  2. Visual Studio Express 2008 et My Templates
    Par kendras dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 03/06/2009, 16h25
  3. Réponses: 4
    Dernier message: 21/01/2009, 14h39
  4. Réponses: 2
    Dernier message: 27/01/2008, 21h22
  5. Fonction ami + template
    Par zenux dans le forum Langage
    Réponses: 8
    Dernier message: 08/12/2006, 15h59

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