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 :

template et class static


Sujet :

Langage C++

  1. #1
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut template et class static
    Bonjour,
    Dans la série template et C++ j'ai un problème que je n'arrive pas à résoudre. Je me tourne alors vers la communauté Dev.com pour avoir votre avis sur la question.

    Le code :
    Vector2PartionHasher.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
    template< uint32 iXHash, uint32 iYHash >
    class RoadNodePartitionHasher
    {
    public:
    	static
    	uint32 Hash( RoadNode const& oRoadNode )
    	{
    		// blabla
    	}
     
    	static
    	uint32 Hash( RoadNode const* pRoadNode )
    	{
    		// blabla
    	}
    };
    SearchTreePlane.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
    #define DEF_TYPE typedef std::list< T* > PtrTypeList
     
    template < class T >
    class SearchTreePlaneNode
    {
    protected:
    	DEF_TYPE;
     
    	uint32				m_iKey;
    	PtrTypeList			m_oDatas;
    	SearchTreePlaneNode< T >*	m_pLeft;
    	SearchTreePlaneNode< T >*	m_pRight;
     
    public:
    	SearchTreePlaneNode();
    	~SearchTreePlaneNode();
     
    	// blabla...
     
    private:
    	void	Insert( uint32 iKey, T const* pData );
    };
     
    template < class T, class Hasher >
    class SearchTreePlane : SearchTreePlaneNode< T >
    {
    	DEF_TYPE;
    public:
    	SearchTreePlane();
    	~SearchTreePlane();
     
    	void	Insert( T const* pData )
    	{
    		SearchTreePlaneNode<T>::Insert(Hasher::Hash( pData ), pData);
    	}
    };
    Et le problème viens de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	RoadNode* pRoadNodeRet = new RoadNode;
    	// Plus haut
    	// SearchTreePlane< RoadNode, RoadNodeHasher > m_oRoadNodeBSTree
    	m_oRoadNodeBSTree.Insert( pRoadNodeRet );
    L'idée c'est comme vous pouvez le voir j'ai un arbre binaire de recherche qui prend pour clef un unsigned int, cet uint32 je l'obtient via un hasher qui est dans une classe qui contient uniquement des méthodes static avec soit des T const& soit des Tconst*.

    Le problème c'est que VC++ ne trouve pas le hasher il me dit :
    Error 16 error C2665: 'eMV::RoadNodePartitionHasher<iXHash,iYHash>::Hash' : none of the 2 overloads could convert all the argument types

    Dans RoadNodePartitionHasher il le pRoadNodeRet n'est ni un const RoadNode&, ni un const RoadNode*, ni un RoadNode&, ni un RoadNode* !

    Merci

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    La fonction Insert ne devrait pas être en publique ou en protégé ? En privé les classes filles vont avoir du mal à y accéder :s

    Sinon en tant que tel il n'y a pas d'autre problè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
     
    struct RoadNode {};
     
    template<int, int>
    struct RoadNodePartitionHasher
    {
      static int Hash( RoadNode const&)
      { return 0; }
     
      static int Hash( RoadNode const*)
      { return 0; }
    };
     
    template<class T>
    class SearchTreePlaneNode
    { void Insert(int, T const*) {} };
     
    template<class T, class Hasher>
    struct SearchTreePlane : SearchTreePlaneNode<T>
    {
      void Insert( T const* pData )
      { SearchTreePlaneNode<T>::Insert(Hasher::Hash( pData ), pData); }
    };
     
    //main
    typedef RoadNodePartitionHasher<0,0> RoadNodeHasher;
    RoadNode* pRoadNodeRet = new RoadNode();
    SearchTreePlane< RoadNode, RoadNodeHasher > m_oRoadNodeBSTree;
    m_oRoadNodeBSTree.Insert( pRoadNodeRet );
    Compile chez moi (j'ai viré tout ce qui servait à rien pour tester l'appel de la fonction). Mais j'ai du rajouter RoadNode à la main et faire un typedef qui ne correspond peut-etre pas à la réalité. Tu pourrais essayer de compléter/modifier ce code par rapport à ce que tu as fait pour retomber sur tes erreurs ?

    L'erreur dit qu'il n'arrive pas à matcher les arguments passés avec les types des déclarations des fonctions. Ca vient peut-etre de RoadNodeHasher, tu pourrais poster le code correspondant à cette classe ?

  3. #3
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Je ne l'avais pas vu mais je viens de localiser le problème. La class RoadNodePartitionHasher était dans le namespace A alors que le reste du code était dans un namespace A::B !
    L'erreur était la suivante :
    Error 29 error C2665: 'A::RoadNodePartitionHasher<iXHash,iYHash>::Hash' : none of the 2 overloads could convert all the argument types \searchtreeplane.h 47

    Que ce soit sur VS2008 ou 2010 ce n'est pas vraiment claire. Je m'attendais dans ce cas plus à un "Inaccessible quelque chose".

    J'avais essayé de crée un projet vide comme vous en essayant d'isoler en ajoutant petit à petit pour retrouver mon problème, mais impossible sachant que je ne prenais jamais les namespaces

    En tout cas merci...

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

Discussions similaires

  1. Méthode template dans classe non template ?
    Par shenron666 dans le forum Langage
    Réponses: 12
    Dernier message: 04/09/2006, 17h50
  2. Template et classe "amie" ?
    Par tintin72 dans le forum Langage
    Réponses: 21
    Dernier message: 11/07/2006, 22h50
  3. Réponses: 15
    Dernier message: 06/04/2006, 12h05
  4. [Info] variable d'une classe static
    Par romdelf dans le forum Langage
    Réponses: 21
    Dernier message: 06/12/2005, 15h08
  5. Pb accès entre 2 classes static
    Par d.w.d dans le forum C++
    Réponses: 5
    Dernier message: 23/02/2005, 19h05

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