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

Langage C++ Discussion :

Fonctions templétisées et include


Sujet :

Langage C++

  1. #1
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut Fonctions templétisées et include
    Bonjour,

    Dans le fichiers Tools.h, j'ai des fonctions templétisées qui me servent de helpers. Quand j'inclue Tools.h dans plusieurs fichiers .cpp, alors j'ai un problème au linkage, le linker me dit que les fonctions templétisées ont déjà été définies.

    Comment faire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<typename T>
    bool FromCtrl(const CWnd& ctrl, T& value)
    {
    ...
    }
    CardReaderManager.obj : error LNK2005: "bool __cdecl FromCtrl(class CWnd const &,class CString &)" (?FromCtrl@@YA_NABVCWnd@@AAVCString@@@Z) already defined in TestCardReaderDlg.obj

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Tu as bien mis les include guards
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef _TOOLS_H
    #define _TOOLS_H
     
    // ton code
     
    #endif
    ?

  3. #3
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Oui bien sûr

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    // Tools.h : header file
    //
     
    #if !defined(AFX_TOOLS_H__A7F90A01_5A01_48E8_BD2A_4187C96CB127__INCLUDED_)
    #define AFX_TOOLS_H__A7F90A01_5A01_48E8_BD2A_4187C96CB127__INCLUDED_
     
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
     
    #include <sstream>  
     
    template<typename T>
    bool FromCtrl(const CWnd& ctrl, T& value)
    {
        CString str;
        ctrl.GetWindowText(str);
    #ifdef _UNICODE
        std::wistringstream iss(static_cast<const TCHAR*>(str));
    #else
    	std::istringstream iss(static_cast<const TCHAR*>(str));
    #endif
        // tenter la conversion vers Dest
        return iss >> value != 0;
    }
     
    template<>
    bool FromCtrl<CString>(const CWnd& ctrl, CString& value)
    {
        ctrl.GetWindowText(value);
     
        return TRUE;
    }
     
    template<typename T>
    bool ToCtrl(CWnd& ctrl, const T& value)
    {
    #ifdef _UNICODE
        std::wostringstream oss(static_cast<T>(value));
    #else
    	std::ostringstream oss(static_cast<T>(value));
    #endif
        // tenter la conversion vers Dest
        bool ret = oss << value != 0;
     
    	if (!ret)
    	{
    		return FALSE;
    	}
     
        CString str = oss.str().c_str();
        ctrl.SetWindowText(str);
     
    	return TRUE;
    }
     
    template<>
    bool ToCtrl<const CString>(CWnd& ctrl, const CString& value)
    {
        ctrl.SetWindowText(value);
     
        return TRUE;
    }
     
    bool ToCtrl(CWnd& ctrl, const TCHAR* value)
    {
        ctrl.SetWindowText(value);
     
        return TRUE;
    }
     
    #endif // !defined(AFX_TESTCARDREADERDLG_H__A7F90A01_5A01_48E8_BD2A_4187C96CB127__INCLUDED_)

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Ceci n'est pas un template de fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<>
    bool FromCtrl<CString>(const CWnd& ctrl, CString& value)
    {
        ctrl.GetWindowText(value);
     
        return TRUE;
    }
    mais une spécialisation, c'est-à-dire une vraie fonction, il faut donc soit la déclarer "inline" soit la mettre dans un .cpp.

  5. #5
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    C'est exactement ça, bien vu

    Question subsidiaire:

    Quel est l'intérêt entre une spécialisation de fonction et une fonction nomal surchargée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<>
    bool FromCtrl<CString>(const CWnd& ctrl, CString& value)
     
    =>
     
    bool FromCtrl(const CWnd& ctrl, CString& value)

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    La cohérence de ton code ?
    La résolution (le terme n'est peut être pas le bon) n'est pas la même :
    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
    26
    27
    28
    29
     
    #include <iostream>
    #include <string>
     
    void fonction(int)
    {
       std::cout<<"int"<<std::endl;
    }
    template<class T>
    void fonction(T)
    {
       std::cout<<"template T"<<std::endl;
    }
    template<>
    void fonction<int>(int)
    {
       std::cout<<"template int"<<std::endl;
    }
     
     
    int main()
    {
       int i(5);
       std::string str("tutu");
       fonction(i);
       fonction<int>(i);
       fonction(str);
      return 1;
    }

  7. #7
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Bizarre, sous VC++ 6.0, il entre 2 fois dans la version non templétisée de int.

    Bref peu importe, c'était juste par curiosité

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/05/2008, 21h29
  2. Soucis avec une fonction et un include
    Par Olivier Regnier dans le forum Langage
    Réponses: 7
    Dernier message: 05/11/2007, 14h58
  3. Fonction dans un <!--#include-->
    Par tribaleur dans le forum ASP
    Réponses: 4
    Dernier message: 01/06/2006, 10h23
  4. [FPDF] Erreur après appel d'une fonction avec include
    Par orus8 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 04/11/2005, 10h49
  5. Réponses: 8
    Dernier message: 19/10/2005, 15h06

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