Neudefinition unterschiedliche Basistypen - alternative zu Hack gesucht
-
Hallo,
ich habe eine MFC-Anwendung und verwende eine gelieferte Headerdatei in der leider CTime definiert ist dadurch bekomme ich folgenden Fehler:
f:header.h(286) : error C2371: 'ATL::CTime': Neudefinition; unterschiedliche Basistypen c:\programme\microsoft visual studio 9.0\vc\atlmfc\include\atltime.h(88): Siehe Deklaration von 'ATL::CTime'Ich hätte gern eine Lösung die es mir erlaubt die gelieferte Headerdatei zu verwenden ohne sie zu manipulieren.
Mein derzeitiger Ansatz ist es die Headerdatei zu verändern und
#define CTime BlaBla
zu definieren. Damit kompiliert der Code und Linkt. Jedoch empfinde ich diese Lösung als nicht gut.1. Kann mir jemand Gefahren aufzeigen die meine aktuelle Lösung birgt ?
2. Kann mir jemand eine Lösung nennen die ohne Manipulation der gelieferten Headerdatei auskommt ?Danke
-
Ohne Gewähr und bloße Vermutung:
Kommt darauf an, wie die 3rd Party .h Datei CTime definiert. Wenn sie es per #define hast du schlechte Karten und musst wohl oder übel die .h Datei verändern.
Wenn es ein typedef oder eine Definition ist kannst du die #include Anweisung in einen eigenen Namensraum schieben um Neudefinitionen zu vermeiden:
#ifndef GuardH #define GuardH namespace N { #include "3rdParty.h" } #endifDamit dürften alle Definitionen (leider keine #defines) der 3rd Party Library im Namespace N landen.
-
Danke, damit müsste ich dann alle Verwendungen des gelieferten CTime mit Namespace verwenden, das ist bei meinem verbleibenden Code eine Menge Veränderung.
Gibt es weitere Alternativen ?
-
DocShoe schrieb:
#ifndef GuardH #define GuardH namespace N { #include "3rdParty.h" } #endifwas passiert wohl, wenn
3rdParty.heinen standard-header includiert?
bb
-
Party?
-
ziemlich ;o)
hier mal nen bsp.:namespace X { #include <string> } int main() { ; }MSVC 9 schrieb:
...
1>c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\stdio.h(198) : fatal error C1003: Mehr als 100 Fehler gefunden; Kompilierung wird abgebrochen.bb
-
DocShoe schrieb:
Ohne Gewähr und bloße Vermutung:
Kommt darauf an, wie die 3rd Party .h Datei CTime definiert. Wenn sie es per #define hast du schlechte Karten und musst wohl oder übel die .h Datei verändern.
Wenn es ein typedef oder eine Definition ist kannst du die #include Anweisung in einen eigenen Namensraum schieben um Neudefinitionen zu vermeiden:
typedef geht nicht. Kann man nur überdefinieren, macht es aber auch nicht leichter.
define lässt sich durch undef beseitigen.#ifndef GuardH #define GuardH namespace N { #include "3rdParty.h" } #endifDamit dürften alle Definitionen (leider keine #defines) der 3rd Party Library im Namespace N landen.
-
MBreuer schrieb:
Hallo,
ich habe eine MFC-Anwendung und verwende eine gelieferte Headerdatei in der leider CTime definiert ist dadurch bekomme ich folgenden Fehler:
f:header.h(286) : error C2371: 'ATL::CTime': Neudefinition; unterschiedliche Basistypen c:\programme\microsoft visual studio 9.0\vc\atlmfc\include\atltime.h(88): Siehe Deklaration von 'ATL::CTime'Definiert diese Headerdatei "ihr" CTime denn auch im Namespace ATL? Ich sehe nicht wie da sonst ein Konflikt entstehen könnte. Mehrdeutigkeit (ambiguity) dann später, ja, aber das gäbe ne andere Fehlermeldung.
Könnte ich mir höchstens vorstellen wenn die Headerdatei entweder Code aus der ATL einfach kopiert hat, oder "private" ATL Headers direkt inkludiert.
Poste mal die Stelle wo das zweite CTime definiert wird ("header.h", Zeile 286).