Je travaille sur une bibliothèque d'événements et je suis confronté à un problème avec des modèles variadiques.
Tout fonctionne très bien, sauf le fait que je ne peux pas passer des références comme paramètres ... p> < p> Voici un exemple très simplifié écrit pour exposer mon problème. p> comme je l'enregistre toutes les instances de retardedsignal dans une seule instance STD :: Liste Je souhaiterais éviter d'utiliser des gabarits Sur la classe elle-même, et c'est pourquoi j'utilise plutôt des modèles sur les constructeurs. Je pourrais également utiliser une classe virtuelle pure comme base pour tous les pointeurs de retardedsignal et enregistrer la classe virtuelle dans la liste des STD :: Liste mais je pense qu'il est préférable de minimiser l'utilisation de méthodes virtuelles et je suis vraiment intrigué par ce problème ... P> Comme vous pouvez le constater dans cet exemple, Test02 et Test04 Erreurs de retour si elles sont activées.
Retardedsignal_debugghelper est presque identique à retardedsignal, à l'exception du fait qu'il utilise argsbis (argument de modèle de classe) sur le dernier constructeur au lieu du modèle ARGS (l'argument de modèle de méthode), sinon cela ne fonctionne pas (comme avec DelayedSignal). Args est accepté sur le Autant que je sache, il n'y a pas de problème sans références ( est là quand même résoudre ce problème? P> Merci. P> P> void (c :: * func) (args ...) code> mais n'est pas avec
argsbis ... args code> dispirez le fait qu'ils sont dans le même Déclaration du constructeur. P>
retardedsignal test04 (& signal
3 Réponses :
J'utilise Clang qui donne un message d'erreur absolument fabuleux: Le compilateur déduit des types de conflit pour Je crois que la meilleure façon de résoudre ce problème est exactement la manière dont vous l'avez fait avec votre args code>: p>
std :: string & code> li>
std :: chaîne code> li>
ol>
retardedsignal_debugghelper code>. P> p>
Bonjour, très intéressant et ... étrange. Mon message d'erreur est moins descriptif: Main.CPP: 2: 74: Erreur: Aucune fonction de correspondance pour appeler à 'RetardseDsignal :: DeleDeDsignal (NOID (SIGNAL
Howard Hinnant a raison ... L'autre possibilité que vous avez est d'utiliser des références partout, par exemple:
Cette solution résout au moins partiellement mon problème. Les deux réponses sont valables, mais comme je ne peux en choisir qu'un seul d'entre eux, j'ai sélectionné celui avec une solution partielle.
Comme vous avez accepté une réponse, il s'agit simplement d'une supplémentation.
Bien que je puisse négliger quelque chose, voici un Test sur Ideone P> < / p> identité code> modèle de classe comme le
SIGHIPE SEULEMENT DE FAIRE CODE COMPILABLE.
Par exemple:
@Valke ne devriez-vous pas baliser cela avec C ++ 0x? J'ai essayé de compiler votre solution et je me demandais pourquoi cela ne fonctionnait pas dans Visual Studio 2011; Après avoir levé des modèles variadiques, je viens de réaliser que si la recherche est correcte, c'est une nouvelle fonctionnalité. Quels compilateurs soutiennent réellement cela quand même?
@LEET: tag Ajoutée. Cette fonctionnalité a été prise en charge par g ++ depuis la version 4.3 - voir ce lien pour plus d'informations: GCC.GNOU .org / Projets / CXX0X.HTML
@Ben VoigT: J'utilise GCC 4.5.0
@leetightShade: Oh désolé, oui je le compile en utilisant c ++ 0x.
@Tonyk: Merci d'avoir ajouté la balise.