Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1635 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [Résolu] typeid

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] typeid

n°1342490
cricri_
Posté le 09-04-2006 à 19:44:55  profilanswer
 

Voilà mon pb, je précise que je commence dans l'utilisation des templates ...
 

Code :
  1. template <class Q>
  2. STDMETHODIMP QueryInterface(Q **pp)
  3. {
  4.  // Interface Dispatcher
  5.  if ( pp == NULL) return E_POINTER;
  6.  ATLASSERT(*pp == NULL);
  7.  if (  typeid(Q) == typeid(IChannel))
  8.   return CBChannel::QueryInterface(pp);
  9.  else if (typeid(Q) == typeid(CServices))
  10.   return m_CParser.QueryInterface(pp);
  11.  return E_NOINTERFACE;
  12. }


 
Et lorsque je déclare :
 

Code :
  1. // Query IDVBChannel Interface to Channel Event
  2. CServices * pIDVBChannel(NULL);
  3. if (FAILED(hr = m_ChannelEvent.QueryInterface(&pIDVBChannel))) {
  4.  _LOG(_T("Failed to QI CServices from Channel Event : %0X" ), hr);
  5. }


 
A la compilation j'ai l'erreur :
 
e:\Dev\Src\Tnt\Ktv3_new\K!TV_02042006_1925\Sources\dvbt\DVBTChannelEvent.h(149) : error C2664: 'CBChannel::QueryInterface' : impossible de convertir le paramètre 1 de 'CServices ** ' en 'IChannel ** '
        Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction
        e:\Dev\Src\Tnt\Ktv3_new\K!TV_02042006_1925\Sources\dvbt\DVBTChannel.cpp(361) : voir la référence à l'instanciation du modèle de fonction 'HRESULT CDVBTChannelEvent::QueryInterface<CServices>(Q ** )' en cours de compilation
        with
        [
            Q=CServices
        ]
 
Je ne pige pas pourquoi l'erreur s'applique au type IChannel alors que j'utilise le type CServices, comme si
typeid ne fonctionnait pas comme je le conçois  !?
 
Merci


Message édité par cricri_ le 10-04-2006 à 15:19:35
mood
Publicité
Posté le 09-04-2006 à 19:44:55  profilanswer
 

n°1342539
++fab
victime du syndrome IH
Posté le 09-04-2006 à 21:32:29  profilanswer
 

A lire le message d'erreur, tu veux passer un CServices** à :
(void?) CBChannel::QueryInterface( IChannel ** );    ( ligne 9 )
 
Tu devrais voir le problème, non ?

n°1342603
Taz
bisounours-codeur
Posté le 09-04-2006 à 22:35:38  profilanswer
 

ne jamais utiliser typeid comme ça. utilise dynamic_cast

n°1342604
KangOl
Profil : pointeur
Posté le 09-04-2006 à 22:36:37  profilanswer
 

d'ailleur ici je vois pas trop l'interet du template ...

n°1342716
cricri_
Posté le 10-04-2006 à 08:46:44  profilanswer
 

@++fab : justement ça ne devrait pas être possible si le typeid faisait son boulot, et cela devrait correspondre au 2ème cas :  
 
       else if (typeid(Q) == typeid(CServices))
 
@Kangol : comment ferais-tu sans Template ?
 
@Taz : ok, je vais essayer avec dynamic_cast, mais dans mon esprit c'était pour des classes dérivées.
 
En tout ca ce n'est pas très clair pour moi ce typeid et son utilisation ...
 
Merci.

n°1342733
nargy
Posté le 10-04-2006 à 09:48:45  profilanswer
 

typeid fonctionne au runtime, quand tu écrit:
  if (     typeid(Q) == typeid(IChannel))
tu n'empêche pas le compilo d'essayer de compiler
            return CBChannel::QueryInterface(pp);
avec le mauvais type.

n°1342750
Taz
bisounours-codeur
Posté le 10-04-2006 à 10:04:26  profilanswer
 

cricri_ a écrit :


@Taz : ok, je vais essayer avec dynamic_cast, mais dans mon esprit c'était pour des classes dérivées.


oh putain, j'avais pas vu ton, truc, tu compares statiquement des types ... ouch !

n°1342767
cricri_
Posté le 10-04-2006 à 10:15:53  profilanswer
 

ok, je crois que je commence à comprendre mon erreur ...
Donc c'est vraiment le dynamic_cast que je dois utiliser dans ce cas.

n°1342776
skelter
Posté le 10-04-2006 à 10:19:21  profilanswer
 

justement nom, le typage est satique, il suffit de specialisé ton template par exemple

n°1342808
nargy
Posté le 10-04-2006 à 10:41:08  profilanswer
 

> justement nom, le typage est satique, il suffit de specialisé ton template par exemple
 
oui, mais l'une des deux lignes typeid()=typeid() est forcément fausse, même si le template lorsqu'il est instancié pourrait permettre une optimisation.

mood
Publicité
Posté le 10-04-2006 à 10:41:08  profilanswer
 

n°1342854
cricri_
Posté le 10-04-2006 à 11:30:46  profilanswer
 

Si je comprends bien il n'y a pas de solution "simple" à mon problème ?

n°1342857
nargy
Posté le 10-04-2006 à 11:32:12  profilanswer
 

si, une fonction virtuelle!

n°1342897
cricri_
Posté le 10-04-2006 à 11:56:15  profilanswer
 

Pour l'instant je ne vois pas trop comment, mais je vais essayer de cogiter là dessus.
Merci

n°1342913
nargy
Posté le 10-04-2006 à 12:04:10  profilanswer
 

Tu fait une classe de base avec la fonction virtuelle:
virtual CService* queryInterface()=0;
Ensuite tu dérive cette classe vers les classes que tu comptes utiliser avec ton template, et tu y réimplémente queryInterface().

n°1343037
cricri_
Posté le 10-04-2006 à 14:19:26  profilanswer
 

Je ne vois pas trop là, car si l'on regarde le 1er message, j'ai 2 interfaces possibles à récupérer : CServices ou IChannel, qui n'ont en fait rien en commun, ce ne sont pas des classes dérivées d'une même classe parente.
 
Il est vrai que je n'ai probablement pas été suffisamment précis à ce niveau ...
Merci


Message édité par cricri_ le 10-04-2006 à 14:20:24
n°1343045
skelter
Posté le 10-04-2006 à 14:26:30  profilanswer
 

tu specialises ton template ou sans template tu fais des surcharges, mais ca revient au meme
 
apres je ne dis pas qu'il n'y a pas de probleme de conception

n°1343083
bjone
Insert booze to continue
Posté le 10-04-2006 à 14:59:28  profilanswer
 

STDMETHODIMP QueryInterface(IChannel **pp)
{
....
}
 
STDMETHODIMP QueryInterface(CServices **pp)
{
....
}
 
:??:
 

n°1343089
cricri_
Posté le 10-04-2006 à 15:04:32  profilanswer
 

Ah ben vi tout simplement ...  :pt1cable:  
Merci  :jap:  

n°1343146
bjone
Insert booze to continue
Posté le 10-04-2006 à 15:42:43  profilanswer
 

:D (en fait c'est ce que tout le monde suggérait depuis le début...)

n°1343249
cricri_
Posté le 10-04-2006 à 16:35:18  profilanswer
 

vi, j'ai fait le boolay sur ce coup là ...  :whistle:  
Je ne sais pas pourquoi, enfin si, je voulais faire ça de la même façon qu'on récupère les interface en DShow ...  :??:  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [Résolu] typeid

 

Sujets relatifs
(résolu) [Java 3D] Changer l'apparence d'objets WaveFront[résolu][C]Aide programmation somme de série numérique.
[résolu][PERL]variable bizzare[RESOLU] créer un tableau dynamique en php
[PHP][GD][Résolu] Création de bordure en fondu[VB.NET] Creer une petit navigateur web [Résolu]
[RESOLU] question tres simple sur nombre de caracteres a l'ecriture[Résolu] Mauvaise incrémentation du NumeroAuto dans Access
[Résolu] Parametre d'une fonction[Résolu][VBA][Access] Appel de proc stock SQL SERVER
Plus de sujets relatifs à : [Résolu] typeid


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR