2015-02-03 7 views
5

ich ein ziemlich großes Projekt am Zusammenstellung, in der ich mitKraft Compiler offenbaren Typ einer Variablen

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

Rechts bei

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

Das Problem ist, dass ich in die ganze mein Projekt gesucht Dateien und ich konnte nirgendwo sonst eine solche Variable finden. Ist es möglich, den Compiler zu zwingen, mir zu sagen, wo er den ursprünglichen Ort einer solchen Definition gefunden hat? Wenn es nicht möglich ist, zumindest ist es möglich, den Typ der ursprünglichen Variablen zur Zeit comfile (Beachten Sie, dass dieses Programm hat so viele andere Fehler und ich kann es nicht ausführen und zeigen Variablentyp. Ich möchte der Compiler enthüllt den Typ für mich).

+1

Der andere 'Room in keine Variable sein muss, es könnte auch eine' typedef' oder eine Funktion sein. Die Fehlermeldung sollte Ihnen sagen, wo die vorherige Deklaration gerade unter dem Bit war, das Sie gepostet haben ("Anmerkung: vorherige Deklaration ..."), vorausgesetzt, Sie verwenden 'g ++'. – Wintermute

+0

@Wintermute Sie haben Recht. Es war eine Funktion. Das Problem war, dass das Zimmer in einer anderen Bibliothek genutzt wurde. Deshalb konnte ich es nicht finden. – barej

Antwort

10

Für den Compiler immer mir die Art von etwas zu zeigen, ich in der Regel eine improptu Klasse wie folgt verwenden:

template <class T> 
struct show_type; 

Dann wird in dem Code, in dem Sie eine Art lernen müssen, dann würden Sie dies tun :

show_type<decltype(room)> t; 

dieser Kompilieren, und die Compiler beschweren werden zu Recht, dass show_type<T> nicht definiert ist; aber die Fehlermeldung wird hilfreich die T buchstabieren, mit der die Instanziierung versucht wurde.

+4

Warum sollten Sie 'show_type' definieren und' 'type' 'überhaupt verwenden? 'Vorlage struct show_type; show_type t; ' –

+0

Vielen Dank. Ich erkannte, dass der variable Raum "doppelt" ist, was für mich immer noch verwirrend ist. Haben Sie eine Idee, wo Sie Ihren ursprünglichen Standort finden können? – barej

+0

@barej Nicht vom Compiler, aber die meisten IDEs haben eine "Gehe zur Definition" -Funktion. – Angew

8

Dies kann einfach getan werden, indem eine Klassenvorlage deklariert und nicht implementiert wird.

template<typename T> 
struct dump; 

dump<decltype(room)> d; 

Dies wird die folgenden Fehlermeldungen auf gcc und Klappern bzw.

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

Live demo

Eine Alternative zu produzieren, dass das Programm, zu kompilieren erlaubt ist zu verwenden Boost.TypeIndex

#include <boost/type_index.hpp> 

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

Dies erzeugt den Ausgang CRoom sowohl gcc und Klirren

Live demo

+0

danke ...... – barej

Verwandte Themen