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 :

Problème sort et template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut Problème sort et template
    Bonjour !

    j'ai un problème avec l'utilisation de templates associées à l'algorithme sort d'un vector. J'ai une structure template

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <class Key_Type, class Data_Type> struct proj 
    { 
       proj(Key_Type i, Data_Type s) : valeur(i), ident(s) {} 
     
       Key_Type valeur; 
       Data_Type ident; 
    };
    et une fonction template

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class Key_Type, class Data_Type> bool sort_cles(const proj<Key_Type,Data_Type>& a1, const proj<Key_Type,Data_Type>& a2) 
    { 
       return a1.valeur < a2.valeur; 
    }
    que je veux utiliser à l'intérieur d'une classe elle_même template pour réaliser un sort sur un vecteur de structure proj

    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
     
    using namespace std;
    template <class Key_Type, class Data_Type> class classe_template
    {
    public:
     
    void fonction();
    };
     
    template<Key_Type,Data_Type>
    void classe_template::fonction(){
     
    vector<proj<Key_Type,Data_Type>> _map2; 
    _map2.push_back(proj<Key_Type,Data_Type>(0.25, 2)); 
    _map2.push_back(proj<Key_Type,Data_Type>(5057.056, 6));
    _map2.push_back(proj<Key_Type,Data_Type>(2.47527, 3));
    _map2.push_back(proj<Key_Type,Data_Type>(0.247527, 1));
     
    sort(_map2.begin(), _map2.end(), sort_cles<Key_Type,Data_Type>);
    }
    Cependant cela ne compile pas. Il me renvoie à une erreur dans xutility??
    (c:\program files\microsoft visual studio 8\vc\include\xutility(323) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1> c:\program files\microsoft visual studio 8\vc\include\algorithm(2822) : voir la référence à l'instanciation de la fonction modèle 'bool std::_Debug_lt_pred<bool(__cdecl *)(const proj<Key_Type,Data_Type> &,const proj<Key_Type,Data_Type> &),proj<Key_Type,Data_Type>,proj<Key_Type,Data_Type>>(_Pr,_Ty1 &,_Ty2 &,const wchar_t *,unsigned int)' en cours de compilation
    1> with
    1> [ ) et ça continue
    où il manquerait une spécification de type. La fonction sort_cles seule fonctionne. Je ne vois pas trop d'où cela peut venir.

    Merci pour votre aide.

  2. #2
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Il vaut mieux utiliser un foncteur que tu définirais ainsi (je te garantis pas que ce soit exempt d'erreur aussi :s):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <class Key_Type, class Data_Type>
    struct SortCles : public binary_function<proj<Key_Type,Data_Type>, proj<Key_Type,Data_Type>, bool>
    {
       bool operator()(proj<Key_Type,Data_Type> a1, proj<Key_Type,Data_Type> a2) 
       { 
          return a1.valeur < a2.valeur; 
       }
    };
    Et après tu appelles sort en lui filant un objet de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort(_map2.begin(), _map2.end(), SortCles<Key_Type,Data_Type>());

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    Merci de ta réponse !

    J'avais déja essayé avec un foncteur pas écrit exactement pareil mais bon... La compilation me donne exactement les même erreurs. Merci quand même.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    On pourrait voir le message d'erreur complet ?
    Est-ce que tu peux fournir un code minimal mais complet qui reproduit le problème ?

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par kiololl
    spécificateur de type manquant - int est pris en compte par défaut.
    Ca là, ça signifie que le compilateur ne connait pas le type (il s'agit sans doute de 'proj').
    Il y a bien un include ? Ou le code est dans un seul fichier à la suite ?

    Sinon la définition de classe_template::fonction est incorrecte, ça devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template<typename Key_Type,typename Data_Type>
    void classe_template<Key_Type,Data_Type>::fonction(){
    ...
    (ou class à la place de typename si tu préfères)

    Quand je colle les bouts de code que tu as donné à la suite dans un fichier (et que je corrige classe_template::fonction) ça compile...

    MAT.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut Code et erreur
    Oui oui tu as raison j'ai changé la formulation par rapport à mon vrai code et j'ai oublié certaines choses. J'ai donc un code minimal qui reproduit l'erreur.


    le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    #include "stdafx.h"
    #include "classe.h"
    #include <set>
    #include <map>
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	classe_template<float,unsigned int>();
    }
    le classe.h
    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
     
    #ifndef __classe__
    #define __classe__
     
     
    #include <cstdio>
    #include <stddef.h>
    #include <stdio.h>
    #include <iostream>
    #include <fstream>
    #include <iomanip>
    #include <stdlib.h>
    #include <ostream>
    #include <time.h>
    #include <math.h>
    #include <map>
    #include <vector>
    #include <set>
    #include <algorithm>
    #include "struct.h"
    using namespace std;
    template <class Key_Type, class Data_Type> class classe_template
    {
    public:
    	classe_template();
    };
     
    template <class Key_Type, class Data_Type>
    classe_template<Key_Type,Data_Type>::classe_template()
    {
    	vector<proj<Key_Type,Data_Type>> _map2;
    	_map2.push_back(proj<Key_Type,Data_Type>(0.25, 2)); 
    	_map2.push_back(proj<Key_Type,Data_Type>(5057.056, 6)); 
    	_map2.push_back(proj<Key_Type,Data_Type>(2.47527, 3));
    	_map2.push_back(proj<Key_Type,Data_Type>(0.247527, 1)); 
    	_map2.push_back(proj<Key_Type,Data_Type>(24.7527, 5)); 
    	_map2.push_back(proj<Key_Type,Data_Type>(24.752, 4));
     
    //  Test de la fonction seule sans le sort. Fonctionne
    	bool test=sort_cles<Key_Type,Data_Type> (proj<Key_Type,Data_Type>(5057.056, 6),proj<Key_Type,Data_Type>(0.247527, 1));
    	test=sort_cles<Key_Type,Data_Type> (proj<Key_Type,Data_Type>(0.247527, 1),proj<Key_Type,Data_Type>(5057.056, 6));
     
    //	sort avec mon foncteur -> erreur de compilation
    //	sort(_map2.begin(), _map2.end(), sort_cles<Key_Type,Data_Type>()); 
     
    //	le même sort mais en utilisant ma fontion et pas un foncteur -> même erreur
    	sort(_map2.begin(), _map2.end(), sort_cles<Key_Type,Data_Type>); 
     
     
    }
    #endif
    et le struct.h
    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
     
    #include <vector> 
    #include <algorithm> 
    #include <iostream> 
    #include <string> 
    #include <set> 
     
    // Définition de notre structure à trier 
     
    template <class Key_Type, class Data_Type> struct proj 
    { 
       proj(Key_Type i, Data_Type s) : valeur(i), ident(s) {} 
     
       Key_Type valeur; 
       Data_Type ident; 
    }; 
     
    // Mon foncteur
    /*
    template <class Key_Type, class Data_Type> struct sort_cles
    { 
       bool operator ()(proj<Key_Type,Data_Type>& a1, proj<Key_Type,Data_Type>& a2) 
       { 
          return a1.valeur < a2.valeur; 
       } 
    }; */
     
    //Ma fonction
     
    template <class Key_Type, class Data_Type> bool sort_cles(const proj<Key_Type,Data_Type>& a1, const proj<Key_Type,Data_Type>& a2) 
    { 
       return a1.valeur < a2.valeur; 
    }
    Voila le message d'erreur que vous devriez normalement avoir :


    1>------ Début de la génération : Projet : temp2, Configuration : Debug Win32 ------
    1>Compilation en cours...
    1>temp.cpp
    1>c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(33) : warning C4305: 'argument' : troncation de 'double' à 'float'
    1> c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(30) : lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>
    1> c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\temp.cpp(12) : voir la référence à l'instanciation de la classe modèle 'classe_template<Key_Type,Data_Type>' en cours de compilation
    1> with
    1> [
    1> Key_Type=float,
    1> Data_Type=unsigned int
    1> ]
    1>c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(34) : warning C4305: 'argument' : troncation de 'double' à 'float'
    1>c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(35) : warning C4305: 'argument' : troncation de 'double' à 'float'
    1>c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(36) : warning C4305: 'argument' : troncation de 'double' à 'float'
    1>c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(37) : warning C4305: 'argument' : troncation de 'double' à 'float'
    1>c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(40) : warning C4305: 'argument' : troncation de 'double' à 'float'
    1>c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(40) : warning C4305: 'argument' : troncation de 'double' à 'float'
    1>c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(41) : warning C4305: 'argument' : troncation de 'double' à 'float'
    1>c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(41) : warning C4305: 'argument' : troncation de 'double' à 'float'
    1>c:\program files\microsoft visual studio 8\vc\include\xutility(323) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1> c:\program files\microsoft visual studio 8\vc\include\algorithm(2822) : voir la référence à l'instanciation de la fonction modèle 'bool std::_Debug_lt_pred<bool(__cdecl *)(const proj<Key_Type,Data_Type> &,const proj<Key_Type,Data_Type> &),proj<Key_Type,Data_Type>,proj<Key_Type,Data_Type>>(_Pr,_Ty1 &,_Ty2 &,const wchar_t *,unsigned int)' en cours de compilation
    1> with
    1> [
    1> Key_Type=float,
    1> Data_Type=unsigned int,
    1> _Pr=bool (__cdecl *)(const proj<float,unsigned int> &,const proj<float,unsigned int> &),
    1> _Ty1=proj<float,unsigned int>,
    1> _Ty2=proj<float,unsigned int>
    1> ]
    1> c:\program files\microsoft visual studio 8\vc\include\algorithm(2879) : voir la référence à l'instanciation de la fonction modèle 'std::pair<_Ty1,_Ty2> std::_Unguarded_partition<_RanIt,bool(__cdecl *)(const proj<Key_Type,Data_Type> &,const proj<Key_Type,Data_Type> &)>(_RanIt,_RanIt,_Pr)' en cours de compilation
    1> with
    1> [
    1> _Ty1=std::_Vector_iterator<proj<float,unsigned int>,std::allocator<proj<float,unsigned int>>>,
    1> _Ty2=std::_Vector_iterator<proj<float,unsigned int>,std::allocator<proj<float,unsigned int>>>,
    1> _RanIt=std::_Vector_iterator<proj<float,unsigned int>,std::allocator<proj<float,unsigned int>>>,
    1> Key_Type=float,
    1> Data_Type=unsigned int,
    1> _Pr=bool (__cdecl *)(const proj<float,unsigned int> &,const proj<float,unsigned int> &)
    1> ]
    1> c:\program files\microsoft visual studio 8\vc\include\algorithm(2903) : voir la référence à l'instanciation de la fonction modèle 'void std::_Sort<std::_Vector_iterator<_Ty,_Alloc>,__w64 int,bool(__cdecl *)(const proj<Key_Type,Data_Type> &,const proj<Key_Type,Data_Type> &)>(_RanIt,_RanIt,_Diff,_Pr)' en cours de compilation
    1> with
    1> [
    1> _Ty=proj<float,unsigned int>,
    1> _Alloc=std::allocator<proj<float,unsigned int>>,
    1> Key_Type=float,
    1> Data_Type=unsigned int,
    1> _RanIt=std::_Vector_iterator<proj<float,unsigned int>,std::allocator<proj<float,unsigned int>>>,
    1> _Diff=__w64 int,
    1> _Pr=bool (__cdecl *)(const proj<float,unsigned int> &,const proj<float,unsigned int> &)
    1> ]
    1> c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(47) : voir la référence à l'instanciation de la fonction modèle 'void std::sort<std::_Vector_iterator<_Ty,_Alloc>,bool(__cdecl *)(const proj<Key_Type,Data_Type> &,const proj<Key_Type,Data_Type> &)>(_RanIt,_RanIt,_Pr)' en cours de compilation
    1> with
    1> [
    1> _Ty=proj<float,unsigned int>,
    1> _Alloc=std::allocator<proj<float,unsigned int>>,
    1> Key_Type=float,
    1> Data_Type=unsigned int,
    1> _RanIt=std::_Vector_iterator<proj<float,unsigned int>,std::allocator<proj<float,unsigned int>>>,
    1> _Pr=bool (__cdecl *)(const proj<float,unsigned int> &,const proj<float,unsigned int> &)
    1> ]
    1> c:\documents and settings\liib8473\my documents\visual studio 2005\projects\temp2\temp2\classe.h(30) : lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>
    1>c:\program files\microsoft visual studio 8\vc\include\xutility(323) : error C2146: erreur de syntaxe : absence de ')' avant l'identificateur 'bkey_t'
    1>c:\program files\microsoft visual studio 8\vc\include\xutility(323) : error C2065: 'bkey_t' : identificateur non déclaré
    1>c:\program files\microsoft visual studio 8\vc\include\xutility(323) : error C2059: erreur de syntaxe : ')'
    1>c:\program files\microsoft visual studio 8\vc\include\xutility(323) : error C2059: erreur de syntaxe : ')'
    1>c:\program files\microsoft visual studio 8\vc\include\xutility(325) : error C2181: instruction else sans if correspondant non conforme
    1>c:\program files\microsoft visual studio 8\vc\include\xutility(325) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>c:\program files\microsoft visual studio 8\vc\include\xutility(325) : error C2146: erreur de syntaxe : absence de ')' avant l'identificateur 'bkey_t'
    1>c:\program files\microsoft visual studio 8\vc\include\xutility(325) : error C2059: erreur de syntaxe : ')'
    1>c:\program files\microsoft visual studio 8\vc\include\xutility(325) : error C2059: erreur de syntaxe : ')'
    1>Le journal de génération a été enregistré à l'emplacement "file://c:\Documents and Settings\liib8473\My Documents\Visual Studio 2005\Projects\temp2\temp2\Debug\BuildLog.htm"
    1>temp2 - 10 erreur(s), 9 avertissement(s)
    ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<proj<Key_Type,Data_Type>>
    Essaye plutôt ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<proj<Key_Type,Data_Type> >

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Par défaut
    Toujours les mêmes erreurs... Je pense que c'est un truc du genre mais impossible de trouver

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Quand je copie tout ça dans un fichier (en mettant le contenu des .h au endroits de leurs inclusions), ça compile.
    Il y a quelques warnings mais aucune erreur.

    Et en release ça donne quoi ?

    Ca doit être une histoire de configuration du projet du coup.
    Dans le log on voit appraître des __w64, c'est voulu ?

    MAT.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/12/2006, 14h42
  2. Problème std::list + templates GCC/G++ 4.x
    Par Amalsek dans le forum GCC
    Réponses: 5
    Dernier message: 12/05/2006, 11h04
  3. Problème de compilation template
    Par Bourrine dans le forum Langage
    Réponses: 4
    Dernier message: 20/01/2006, 21h15
  4. [XSLT] Problème avec apply-templates
    Par NeoMan dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/12/2005, 14h45

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