2009-10-15 4 views
7

Mi chiedo se c'è un modo per ottenere informazioni migliori sulla posizione di un errore in msvc (2005)?C'è un modo per ottenere informazioni migliori sul contesto di un errore quando si utilizza msvc? (es: C2248)

Ad esempio, quando eredita da boost :: noncopyable nella mia classe ottengo un errore di C2248 dicendo qualcosa del tipo:

errore C2248: 'boost :: noncopyable _ :: :: noncopyable noncopyable': non può accedere membro privato dichiarato in classe 'boost :: noncopyable _ :: noncopyable'. Questa diagnostica è verificato nella funzione compilatore ha generato 'MyClass :: MyClass (const MyClass &)'

ma non riescono a dirmi dove esattamente il costruttore di copia è stato chiamato. Questo è un po 'fastidioso. Non sono sicuro, ma penso di ricordare di aver visto le impostazioni da qualche parte in cui potrei specificare il livello di output o qualcosa, ma ho cercato e trovato nulla, quindi la mia domanda è: c'è un modo per migliorare (più pieno?) Messaggio di errore in msvc ?

Edit: Beh, poiché StackOverflow mi ha appena detto che dovrei cercare di accettare una risposta, mi chiedevo se qualcuno potesse dire se msvc 2008/2010 fornisce una diagnostica migliore per questo errore? Qualcuno ha anche parlato del GCC, qualcuno può confermarlo? Che dire di altri compilatori (Intel ?, Comeau?)

Grazie

+2

Ho incontrato anche quello prima. Forse varrebbe la pena di segnalarlo su connect.microsoft.com – jalf

+0

Sembra che sia già segnalato e chiuso come wont-fix perché è stato giudicato non abbastanza importante. Grazie per il link che non sapevo di questo. Sembra che possa essere utile. – n1ckp

+0

Ecco il collegamento su connect se qualcuno si preoccupa di votarlo: https://connect.microsoft.com/VisualStudio/feedback/details/467747/compiler-shows-error-but-with-no-hint-to-the : agli utenti-codice sorgente. Appena avuto un problema simile con un punto e virgola mancante alla fine di una definizione di classe e vs non mi avrebbe dato alcun suggerimento utile nell'errore. – n1ckp

risposta

4

Posso confermare con Code :: Blocks e VC++ 2005, che non fornisce alcun indizio dove si verifica l'errore. Neanche dichiara il proprio aiuto per il costruttore di copie private.

#include <boost/noncopyable.hpp> 

class X: boost::noncopyable 
{ 
}; 

void foo(X x) {} 

int main() 
{ 

    X x; 
    foo(x); 
} 

Il registro di compilazione (linea di cinque è l'ultima riga della dichiarazione della classe):

main.cpp(5) : error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable' This diagnostic occurred in the compiler generated function 'X::X(const X &)'

A meno che non ci sia un'opzione del compilatore per consentire diagnostica degli errori più approfonditi, questo wouldn Per me è la prima volta che compilo semplicemente il file con GCC (MinGW) per ottenere più utili diagnosi degli errori. (Ahimè, il tuo codice dovrebbe essere privo di estensioni VC++.)

+0

Non ricordo che o ne. Almeno uno può indovinare piuttosto rapidamente qual è il problema con noncopyable. –

+0

Il problema non è con noncopyable. Il problema è con * il tuo * codice che tenta di copiare qualcosa che non dovrebbe essere copiato. – UncleBens

+1

Ecco cosa intendevo. Quando si utilizza un noncopyable, è possibile capire rapidamente cosa significa, a differenza di altri casi d'uso. Non c'è anche nessun interruttore cl.exe utile che faccia luce su questo. –

-1

Nella finestra di uscita o la costruzione di log si dovrebbe vedere dove il compilatore ha cercato di utilizzare il modello nel codice ... bisogna scorrere un po 'però.

Se non c'è abbastanza informazioni nei log di costruzione, c'è anche un'opzione che controlla la verbosità msbuild:
Strumenti> Opzioni> Progetti e Solutions-> costruire e Esegui-> MSBuild prolissità output del progetto

+0

Grazie, sono state esattamente le opzioni a cui stavo pensando: proverò a vedere se fornisce più informazioni e mi riporto, grazie – n1ckp

+2

ho provato, purtroppo non aiuta - vedi risposta UncleBens –

0

È possibile creare temporaneamente un costruttore di copia manuale (con la stessa firma) e l'implementazione predefinita, solo allo scopo di rintracciare questo errore ..? Non sono sicuro se ciò lo renderebbe più facile da trovare.

+0

La mia domanda è non correlato a questo particolare errore Il mio errore attuale non è correlato a un costruttore di copie.Esso, grazie per aver risposto. – n1ckp

-1

Aprire la finestra di output, in cui viene visualizzato il log completo dell'edificio. Controlla lì il messaggio di errore. Sotto questo messaggio di errore, di solito puoi trovare più informazioni che possono aiutarti a rintracciare la fonte del problema.

Se si fa doppio clic sul problema nell'elenco degli errori e si passa alla finestra di output, il cursore verrà posizionato su tale messaggio di errore.

+0

Hmm sapevo che avrei dovuto copiare/incollare la stringa completa in modo da non pensare di essere questo dalla finestra di errore. Ho ottenuto questo dalle finestre di output e l'unico riferimento che ho trovato per trovare l'errore è il file .cpp in cui si è verificato l'errore ma vorrei sapere la posizione della chiamata al costruttore di copia o altro informazioni che riesco a ottenere. Grazie comunque – n1ckp

+0

Con i modelli di solito devi scorrere verso il basso oltre un po 'di "rumore" per arrivare alla parte in cui è citata la tua fonte. –

0

In realtà, il modo migliore per risolvere questo (VS2013 qui) sembra strisciare sopra la finestra di uscita in modo iterativo:

1/quando si ottiene il messaggio "Questa diagnosi è verificato nella funzione compilatore ha generato 'X :: X (const X &) "" nell'output, vai alla tua classe 'X' e rimuovi esplicitamente il costruttore di copie usando la notazione C++ 11: "X (const X &) = delete;"

2/ricompilare, ora l'output deve visualizzare lo stesso errore ma con una diagnostica che si verifica su classi figlio, quindi eseguire di nuovo il ciclo al passaggio 1 per eliminare esplicitamente il costruttore di copie sulla classe figlio, fino a raggiungere il vero guasto classe ...