Tout en travaillant sur mon propre type Erasure Itérateur, j'ai eu un problème dans lequel le compilateur (MSVC10) s'est écrasé avec un débordement de pile sur ce code: évidemment, j'ai tout supprimé Je peux où reste le bogue. (Code d'origine était de 780 lignes) Suppression de tous les paramètres de modèle restants entraîne la compilation du code. P> Le message d'erreur complet est le suivant: P> main.cpp(23): fatal error C1063: compiler limit : compiler stack overflow
main.cpp(20) : see reference to class template instantiation 'from<basetype,void,valuetype>' being compiled
3 Réponses :
Eh bien, j'abandonne, mais j'ai réussi à générer un avertissement:
Notez que mon code a trois classes de modèle, test code> uniquement hérite de quel que soit Test code> n'hérite pas de quel que soit
Inverser l'héritage de quel que soit
J'ai renommé les cours et les a réorganisés pour le rendre légèrement plus évident pourquoi chacune des classes est requise et comment les pièces fonctionnent.
Oui, ce n'est peut-être qu'une reproduction légèrement légèrement mince, car je ne pouvais pas trouver une syntaxe qui travaillait dans VS2010 et je suis sur SP1. La capture semble être si le modèle non spécialisé n'est pas la première classe de base qui se bloque. Vous voudrez peut-être envoyer ceci à Microsoft si vous n'avez pas déjà curieux de voir ce qu'ils ont à dire à ce sujet.
comme solution de contournement, envisagez d'introduire une classe supplémentaire entre le le Suite à un programme complet devrait compiler sans erreur: p> non spécifié tout code> et la spécialisation avec catégorie = vide code>:
Solution la plus simple: remplacer: avec: p>
@Xeo: En fait ... il semble fonctionner ... J'ai ajouté des fonctions membres à vérifier. Wtf? Bonne trouvaille ...
@MOOING: Cela ne devrait pas faire cela, car vous auriez besoin de changer les paramètres de modèle du boîtier Void code> également.
@Xeo: Ah à droite, mon petit test n'a pas vérifié que c'était une catégorie qui était nulle.
Pour ce que cela vaut, GCC 4.6 compile votre code d'échantillon sans problème (sur Linux / Debian / Sid / Amd64). Peut-être que vous pourriez passer à GCC (par exemple, une variante Mingw ou Cygwin ...)?
En fait, j'ai fait une juste quantité de débogage via Ideone, mais ma commande-fu-fu et ma Linux sont faibles, de sorte que Cygwin est intimidant. Je commence à jouer avec ça.
Vous avez une classe de modèle qui hérite de lui-même? Ou suis-je en train de lire ce faux?
Assurez-vous d'obtenir GCC 4.6 car il progresse beaucoup pour la dernière conformité standard C ++ ...
@ AJG85:
itérator_from_any code> hérite du itérator_from_any code> Spécialisation i>, qui est légal c ++, mais peut i > Soyez ce qui trébuche MSVC10. @MOOINGDUCK: Cela me traduit certainement. Je ne savais pas que vous pouvez hériter d'une spécialisation partielle de vous-même mais techniquement, je suppose que c'est un nouveau type? Avez-vous essayé de jouer avec les paramètres du compilateur sur MSVC10?
@ AJG85: Chaque instanciation de modèle est son propre type, alors oui, ils peuvent hériter les uns des autres, tant que la profondeur est inférieure à 1024 (dans mon cas, il est donc très certainement moins). Je n'ai trouvé aucun paramètre qui semble probable. Aucune suggestion?
@MOOINGDUCK: Pas vraiment. Je viens de frapper un peu avec des extensions et des optimisations invalidantes, mais un même accident, peu importe ce que j'ai essayé. J'ai eu un hostume que parce que la spécialisation était basée sur une déclaration en avant avant la définition de la définition qu'elle pourrait être optimisée avant l'instanciation qui le pense que la classe de base était elle-même lorsque CL.EXE s'exécute.
Veuillez envisager de signaler cela comme un bogue chez Microsoft Connect et rapporte ici avec un lien avec un lien. Si vous ne voulez pas signaler le problème, faites-le moi savoir et je suis heureux de le signaler.
Hein, désolé pour la question, mais wtf est-ce? O.o
Rapport de bogue chez connect.microsoft.com/visualstudio/feedback/Détails/714003
@Blackbear: une implémentation d'Any_iterator à l'aide de l'effacement de type. Quelle partie vous confondre?
@MOOINGDUCK: À peu près tout car je n'ai aucune expérience en C ++;)
@Blackbear: Ah, c'est ... une question plutôt technique.
Tout code> est une interface abstrait imbriquée etde code> est une implémentation imbriquée.