7
votes

Overflow de pile de compilateur sur le code de modèle

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: xxx pré>

é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


14 commentaires

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 hérite du itérator_from_any Spécialisation , qui est légal c ++, mais peut 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 est une interface abstrait imbriquée et de est une implémentation imbriquée.


3 Réponses :


1
votes

Eh bien, j'abandonne, mais j'ai réussi à générer un avertissement: xxx


4 commentaires

Notez que mon code a trois classes de modèle, test uniquement hérite de quel que soit et une classe non liée. Test n'hérite pas de quel que soit . Je vais essayer de renverser l'ordre d'héritage et voyez si cela corrige n'importe quoi.


Inverser l'héritage de quel que soit et le type non lié ne résout pas le problème. Je ne vois aucune différence réelle entre votre code et le mien ...


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.



1
votes

comme solution de contournement, envisagez d'introduire une classe supplémentaire entre le non spécifié tout et la spécialisation avec catégorie = vide : xxx

le Suite à un programme complet devrait compiler sans erreur: xxx


0 commentaires

1
votes

Solution la plus simple: remplacer: xxx

avec: xxx


3 commentaires

@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 également.


@Xeo: Ah à droite, mon petit test n'a pas vérifié que c'était une catégorie qui était nulle.