2010-01-27 4 views
3

J'ai une classe qui est définie comme suit:déduction modèle dans dynamic_cast

template <class WidgetType> 
class CometWidget : public WidgetType; 

l'intérieur d'une fonction que je fais ceci:

dynamic_cast<CometWidget *>(iter2->second.second)->changesCommited_(); 

et il résout le type CometWidget, est conforme et exécuter correctement.
Le code s'exécute dans la classe CometWidget.
Comment diable est-ce possible?
Pourquoi est-ce ainsi? Devrait-il même compiler?

+1

Pouvez-vous ajouter le code source de la fonction? Si c'est dans la déclaration de 'CometWidget', vous n'avez pas besoin de qualifier explicitement le modèle (ou tout terme que vous utilisez pour dire' CometWidget <...> '). – MSN

+0

Il se trouve dans CometWidget. Ajoutez ceci comme réponse et je vous changerai. Savez-vous pourquoi cela arrive? –

+0

C'est la technologie martienne, ne demandez pas ... –

Répondre

2

Si c'est dans la déclaration de CometWidget alors vous n'avez pas besoin de qualifier explicitement le modèle (ou tout terme que vous utilisez pour dire CometWidget<...>).

+0

Pourriez-vous me montrer la partie de la norme qui le dit? –

+0

http://stackoverflow.com/questions/1263825/is-this-valid-c-code/1264004#1264004 – MSN

0

Très intéressant en effet. Cela me semble être un bug de compilateur intéressant.

Il est possible de déduire l'argument correct du modèle CometWidget <> de la même manière que vous pouvez déduire des paramètres de modèle d'une fonction à partir de la liste d'arguments. Si cela devait être statique, ce serait moins surprenant.

Avec la distribution dynamique, il est peu probable d'être en commun entre le type source et le type cible. Donc, une telle "supposition" pourrait avoir eu lieu, mais alors ce n'est pas légitime.

De quel compilateur s'agit-il?

+0

C'est VC++ 2008. Voir le commentaire de MSN. Est-ce qu'il a raison? –

+0

@the_drow oui MSN a raison. Le "CometWidget" est appelé le "nom de classe injecté". Si vous l'écrivez à partir du modèle, alors il est équivalent au nom avec la liste de paramètres suivie et nomme un type, pas le modèle. –

+0

litb - ajoutez ceci comme une réponse et je l'accepterai :) –

Questions connexes