2015-02-03 10 views
5

Sto compilando una piuttosto grande progetto in cui ho affrontato conforza compilatore per rivelare il tipo di una variabile

error: ‘CRoom room’ redeclared as different kind of symbol

Proprio

class CRoom 
{ 
..... 
} room("test"); 

Il problema è che ho cercato in tutto il mio progetto file e non ho potuto trovare una tale variabile da nessun'altra parte. È possibile costringere il compilatore a dirmi dove ha trovato il luogo originale di tale definizione? Se non è possibile, almeno, è possibile rivelare il tipo della variabile originale in un momento confortevole (si noti che questo programma ha tanti altri errori e non posso eseguirlo e mostrare il tipo di variabile. Voglio che il compilatore sveli il tipo per me).

+1

L'altro 'room' non deve essere una variabile, potrebbe anche essere una' typedef' o una funzione. Il messaggio di errore dovrebbe dirti dove la dichiarazione precedente era appena sotto il bit che hai postato ("nota: dichiarazione precedente ..."), assumendo che tu usi 'g ++'. – Wintermute

+0

@Wintermute Hai ragione. Era una funzione. il problema era che la stanza era usata in una libreria diversa. Ecco perché non riuscivo a trovarlo. – barej

risposta

10

Per ottenere il compilatore di mostrarmi il tipo di qualcosa, io di solito uso una classe improptu come questo:

template <class T> 
struct show_type; 

Poi, nel codice in cui è necessario imparare un tipo, faresti questo :

show_type<decltype(room)> t; 

compilare questo, e il compilatore giustamente lamentano che show_type<T> non è definita; ma il messaggio di errore spiegherà utilmente lo T con il quale è stata tentata l'istanziazione.

+4

Perché preoccuparsi di definire 'show_type' e usare' :: type'? 'template struct show_type; show_type t; ' –

+0

Grazie mille. Mi sono reso conto che la variabile room è 'double', il che mi confonde ancora. hai qualche idea su come trovare la sua posizione originale? – barej

+0

@barej Non dal compilatore, ma la maggior parte degli IDE ha una funzione "Vai alla definizione". – Angew

8

Questo può essere fatto facilmente dichiarando un modello di classe e lasciandolo non implementato.

template<typename T> 
struct dump; 

dump<decltype(room)> d; 

Questo produrrà i seguenti messaggi di errore su gcc e clang rispettivamente

error: aggregate 'dump<CRoom> d' has incomplete type and cannot be defined 
error: implicit instantiation of undefined template 'dump<CRoom>' 

Live demo

Un'alternativa, che permette al programma di compilazione, è quello di utilizzare Boost.TypeIndex

#include <boost/type_index.hpp> 

std::cout << boost::typeindex::type_id_with_cvr<decltype(room)>().pretty_name() << '\n'; 

Questo produce l'uscita CRoom sia gcc e clang

Live demo

+0

grazie ...... – barej

Problemi correlati