Code gefunden, kann nicht compilieren :(
-
Hi,
wieso kann ich den net compilieren?
/* * John Martin: john.p.martin@eudoramail.com * * This file demostrates the typeselect utility template. This file utilizes * code derived from Andrei Alexandrescu's book: Modern C++ Design, Design Patterns * and Generic Programming Applied published by Addison Wesley. His code is free * to use and so is mine. Enjoy. * */ #include <iostream> using namespace std; // used to terminate typelists class null_type {}; // used to recursively create lists of types template <class U, class V> struct typelist { typedef U head_type; typedef V tail_type; }; // helper macros for managing typelists #define TL_1(T1) typelist<T1, null_type> #define TL_2(T1,T2) typelist<T1, TL_1(T2) > #define TL_3(T1,T2,T3) typelist<T1, TL_2(T2,T3) > #define TL_4(T1,T2,T3,T4) typelist<T1, TL_3(T2,T3,T4) > // used to choose between two types at compile time template <bool Expr, class U, class V> struct select_type { typedef U result_type; }; // specialization for false conditions template <class U, class V> struct select_type<false, U, V> // <<<<<<<<<<< HIER GIBBET FEHLER!!! { typedef V result_type; }; // choose a type based on a specific size template <unsigned int Size, class TList> struct select_type_size; template <unsigned int Size, class U, class V> struct select_type_size<Size, typelist<U, V> > { typedef typename select_type < Size == sizeof(U), U, typename select_type_size<Size, V>::result_type >::result_type result_type; }; // specialization if a type is not found use null_type to generate a compile time error template <unsigned int Size> struct select_type_size<Size, null_type> { typedef null_type result_type; }; // define a list of types typedef TL_4(signed char, short int, int, long int) signed_ints; typedef TL_4(unsigned char, unsigned short, unsigned int, unsigned long) unsigned_ints; // now when we port to different platforms we have guaranteed fixed size types // or the compiler generates an error if we use an invalid type. typedef select_type_size<1, signed_ints>::result_type int8_t; typedef select_type_size<2, signed_ints>::result_type int16_t; typedef select_type_size<4, signed_ints>::result_type int32_t; typedef select_type_size<1, unsigned_ints>::result_type uint8_t; typedef select_type_size<2, unsigned_ints>::result_type uint16_t; typedef select_type_size<4, unsigned_ints>::result_type uint32_t; // what select_type_size does is iterate through a list of types at compile // time looking for a type of a specific size, when its found it sets int main(int argc, char** argv) { cout << "sizeof(int8_t) == " << sizeof(int8_t) << endl; cout << "sizeof(int16_t) == " << sizeof(int16_t) << endl; cout << "sizeof(int32_t) == " << sizeof(int32_t) << endl; cout << "sizeof(uint8_t) == " << sizeof(uint8_t) << endl; cout << "sizeof(uint16_t) == " << sizeof(uint16_t) << endl; cout << "sizeof(uint32_t) == " << sizeof(uint32_t) << endl; return 0; }
das sind die Fehler:
main.cpp(45): fatal error C1903: unable to recover from previous error(s); stopping compilation
main.cpp(45): error C2065: 'U' : undeclared identifier
main.cpp(45): error C2065: 'V' : undeclared identifier
main.cpp(45): error C2687: cannot define a nested UDT of a template class out of lineWas mach ich falsch?
-
du machst anscheinend gar nix falsch, siehe
http://www.gamedev.net/community/forums/topic.asp?topic_id=207373mit dem g++ lässt es sich einwandfrei kompilieren. probier doch mal dev-cpp mit mingw http://www.bloodshed.net/dev/devcpp.html wird höchstwahrscheinlich auch funktionieren.
-
und wie bekomm ich das zum laufen unter VC++7?
-
7.0 garnet, erst ab 7.1 (Auf meinem jedenfalls funzt loki)
-
ness schrieb:
7.0 garnet, erst ab 7.1 (Auf meinem jedenfalls funzt loki)
Sowohl für den 6.0 als auch für den 7.0 gibt es Portierungen von Loki.
Siehe: http://sourceforge.net/projects/loki-lib/
-
In gedankem an deren buchseitenlange Fehlermeldungen läufts mir immernoch kalt den Rücken runter...
-
HumeSikkins schrieb:
Sowohl für den 6.0 als auch für den 7.0 gibt es Portierungen von Loki.
Wobei es wahscheinlich einfacher ist, sich 'nen aktuellen Compiler zu besorgen.
-
groovemaster schrieb:
HumeSikkins schrieb:
Sowohl für den 6.0 als auch für den 7.0 gibt es Portierungen von Loki.
Wobei es wahscheinlich einfacher ist, sich 'nen aktuellen Compiler zu besorgen.
Für jemanden der nur privat und/oder nur zum Spass programmiert sicher. Für alle anderen gibt es oft genug Gründe warum ein Compilerwechsel nicht möglich ist.
In gedankem an deren buchseitenlange Fehlermeldungen läufts mir immernoch kalt den Rücken runter
Potentiell lange Fehlermeldungen sind ein generelles Problem von Template-Code nicht nur von diesen Ports.
Nichtsdestotrotz sollte man sich sicher gut überlegen, ob man eine Bibliothek wie Loki (oder eine komplexe boost-Bibliothek) auf einem Compiler wie dem VC 6.0, 7.0 (oder gcc 2.9.5 um mal einen nicht MS-Compiler mit ähnlichen Problemen zu nennen) wirklich verwenden will. Man treibt solche Compiler damit wirklich an und über ihre Grenzen.
-
HumeSikkins schrieb:
Potentiell lange Fehlermeldungen sind ein generelles Problem von Template-Code nicht nur von diesen Ports.
Stimmt!->kann man das irgendwie umgehen? Fast mein gesamter code (bis auf main.cpp und stdafx.cpp
)sind header, vollgestopft mit templates, und das da nicht gleich alles so passt wies soll ist klar. Aber die Fehlermeldungen dazu! Nicht unwahrscheinlich, das in schludrigem code der Fehler 4* so lang ist wie das template. Ich hab wie gesagt VC 7.1, könnte man da wenigstens das with x x x ausschalten und nur bedingt - wenn mans braucht wieder anmachen?
-
Hallo,
in manchen Fällen hilft STLFilt. Ansonsten sind Form und Konfigurierbarkeit von Error-Messages natürlich vollständig Compiler-abhängig. Da müsstest du schon mal einen Blick in den Compiler-Handbuch werfen.