8
votes

Existe-t-il un moyen d'obtenir de meilleures informations pour le contexte d'une erreur lors de l'utilisation de MSVC? (ex: c2248)

Je me demande s'il existe un moyen d'obtenir de meilleures informations sur l'emplacement d'une erreur dans MSVC (2005)?

Par exemple, lorsqu'il est héritable de Boost :: Non-gai dans ma classe, j'obtiens une erreur C2248 disant quelque chose comme:

Erreur C2248: 'Boost :: Non gèred _ :: Non gère :: Non goudable': Impossible d'accéder au membre privé déclaré en classe 'Boost :: Non gère _ :: Non géré non géré. Ce diagnostic s'est produit dans la fonction générée par compilateur 'myClass :: myclass (const myclass &)'

Mais cela ne manquera pas de me dire où le constructeur de copie a été appelé. C'est un peu gênant. Je ne suis vraiment pas sûr, mais je pense que je me souviens de voir des paramètres quelque part où je pouvais spécifier le niveau de sortie ou quelque chose que j'ai cherché et je n'ai rien trouvé de sorte que ma question est: y a-t-il un moyen d'obtenir un meilleur message d'erreur (Fuller?) Dans MSVC ?

Edit: Eh bien que Stackoverflow vient de me dire que je devrais chercher à accepter une réponse, je me demandais si quelqu'un pouvait dire si MSVC 2008/2010 donne un meilleur diagnostic pour cette erreur? Quelqu'un a également mentionné GCC devrait faire, quelqu'un peut-il confirmer cela? Qu'en est-il des autres compilateurs (Intel?, Comeau?)

merci


4 commentaires

Je suis passé dans celui-là avant aussi. Peut-être que ce serait la peine de le signaler sur Connect.Microsoft.com


On dirait que cela a été déjà signalé et fermé comme étant-la-net, car il a été jugé suffisamment important. Merci pour le lien que je ne connaissais pas à ce sujet. Il semble que cela puisse être utile.


Voici le lien sur Connecter si quelqu'un soin de la voter: Connect.Microsoft.com/visualstudio/feedback/Détails/467747/... . Il suffit d'avoir un problème similaire avec un point-virgule manquant à la fin d'une définition de classe et vs ne me donnerait aucune indication utile dans l'erreur.


Toujours brisé dans vs20013u4. :(


5 Réponses :


-1
votes

Dans la fenêtre de sortie ou le journal de construction, vous devez voir où le compilateur a essayé d'utiliser le modèle de votre code ... Vous devez faire défiler un peu cependant.

S'il n'y a pas assez d'informations dans les journaux de construction, il existe également une option contrôlant la verbosité MSBUILD:
Outils-> Options-> Projets et solutions-> Verbosité de sortie du projet MSBUILD


1 commentaires

Merci. C'était exactement les options que je pensais. Je vais essayer de voir si cela donne plus d'informations et rapportera. Merci.



0
votes

Vous pouvez créer temporairement un constructeur de copie manuelle (avec la même signature) et la mise en œuvre par défaut, juste dans le but de suivre cette erreur ..? Je ne sais pas si cela faciliterait la recherche.


1 commentaires

Ma question n'est pas liée à cette erreur particulière. Mon erreur actuelle n'est pas liée à un constructeur de copie. C'était un exemple. Néanmoins, merci d'avoir répondu.



-1
votes

Ouvrez la fenêtre de sortie, où le journal complet du bâtiment est affiché. Vérifiez-y le message d'erreur. Sous ce message d'erreur, vous pouvez généralement trouver plus d'informations pouvant vous aider à retrouver la source du problème.

Si vous double-cliquez sur le problème de la liste des erreurs et de la fenêtre Aller à la fenêtre de sortie, le curseur sera positionné sur ce message d'erreur.


2 commentaires

Hmm je savais que je devrais avoir copier / collé la chaîne complète afin que vous ne pensez pas que j'ai eu ceci à partir des fenêtres d'erreur. J'ai eu ceci à partir des fenêtres de sortie et la seule référence que je dois trouver l'erreur est le fichier .cpple dans lequel l'erreur s'est produite, mais j'aimerais connaître l'emplacement de l'appel au constructeur de copie ou plus encore d'informations que je peux obtenir. Merci quand même.


Avec des modèles, vous devez généralement faire défiler l'arrêt du «bruit» pour arriver à la partie où votre source est mentionnée.



4
votes

Je peux confirmer avec code :: Blocks et VC ++ 2005, qu'il ne donne aucune indication où l'erreur se produit. Ni la déclaration de votre propre constructeur de copie privée.

#include <boost/noncopyable.hpp>

class X: boost::noncopyable
{
};

void foo(X x) {}

int main()
{

    X x;
    foo(x);
}


6 commentaires

Ne se souvint pas celui-là. Au moins on peut deviner plutôt rapidement ce que le problème est avec non géré.


Le problème n'est pas avec non géré. Le problème est avec votre code essayant de copier quelque chose qu'il ne devrait pas copier.


C'est ce que je voulais dire. Lors de l'utilisation de non-fonctionnement, vous pouvez au moins comprendre rapidement ce que cela signifie, contrairement à d'autres cas d'utilisation. Il n'y a pas non plus de commutateur CL.EXE utile qui met plus de lumière à ce sujet.


Eh bien, c'est triste pour MSVC, mais je vais jeter un oeil à l'installation de GCC si je ne trouve pas une autre solution de contournement pour mon problème, juste pour voir le message d'erreur là-bas. Félicitations, vous avez testé la solution plus rapidement que moi). Je vais attendre une journée ou 2 pour voir si d'autres réponses entrent, mais j'ai vérifié les options du compilateur pour MSVC et ne ressemblent pas à une option pour de meilleurs messages d'erreur, donc je vais probablement accepter votre réponse. Merci beaucoup!


Bien sûr, vous pourriez vérifier un passage similaire par valeur. Une autre chose: vous n'essayez pas de stocker vos objets non couchés dans un conteneur standard?


Eh bien, mon problème n'est pas même lié au constructeur de copie (c'est la même erreur C2248, cependant, de tenter d'accéder à un membre privé), donc non, mais je pense que je pourrai le résoudre. Merci pour l'aide de l'aide.



0
votes

En fait, le meilleur moyen de contourner ce problème (VS2013 ici) semble ramper sur la fenêtre de sortie itérativement:

1 / Lorsque vous obtenez le message "Ce diagnostic s'est produit dans la fonction Compiler générée" x :: x (const x &) "" dans la sortie, accédez à votre classe "x" et supprimez explicitement le constructeur de copie en utilisant le C ++ 11 Notation: "x (const x &) = Supprimer;"

2 / recompilez, la sortie doit maintenant afficher la même erreur, mais avec un diagnostic sur des classes enfants, puis une boucle à nouveau à l'étape 1 pour supprimer explicitement le constructeur de copie sur la classe enfant, jusqu'à ce que vous atteigniez la vraie classe défectueuse. ...


0 commentaires