E2401 - template Problem
-
Hallo Leute!
Sowohl Borland C++ Builder 6 als auch Borland C++ Compiler 5.5 bringen mir diesen fehler
gcc, vc++, dmc++,... kompilieren fehlerfrei - scheint also ein kleiner bug im Borland C++ Builder zu sein - die frage ist: gibt es einen workaround der das interface beibehaelt?
//schaut nach, ob Value ein DefaultPolicy ist, und returned je nach dem //entweder Value oder Default. template<class Value, class Default> struct GetPolicy { typedef typename IfThenElse < IsSame < Value, DefaultPolicy >::result, Default, //hier kommt der fehler (Zeile 152) Value >::result result; }; //IfThenElse sieht so aus: template<bool condition, class Then, class Else> struct IfThenElse { typedef Then result; }; template<class Then, class Else> struct IfThenElse<false, Then, Else> { typedef Else result; }; //isSame sieht so aus: template<class T1, class T2> struct IsSame { enum { result = false }; }; template<class T1> struct IsSame<T1, T1> { enum { result = true }; };
die genaue fehlermeldung ist
Error E2401 c:\code\cpp\cppgi\util/util.hpp 152: Invalid template argument list
Error E2040 c:\code\cpp\cppgi\util/util.hpp 154: Declaration terminated incorrectlyleider kenne ich mich mit dem Borland C++ Builder nicht so gut aus, ich versuche nur meine lib auf moeglichst allen compilern zum laufen zu bringen.
wichtig ist vielleicht noch:
das ganze geschieht beim parsen: also GetPolicy wird garnicht aufgerufen, sondern der BCB scheitert an der syntax
-
Hi,
liegt wohl nicht am Default, sondern am Parameter davor.
typedef typename IfThenElse < IsSame <bool,bool>::result,Default,Value> ::result result;
funzt
IsSame <Value, DefaultPolicy >::result
liefert wohl kein bool- Typ zurück, obwohl IfThenElse diesen als ersten Parameter erwartet. Vielleicht kommen andere Compiler damit klar...
glaub ich zumindest...
-
danke!
es lag an dem IsSame - das wollte er nicht schlucken.
deswegen hab ich jetzt einen BCB workaround dafuer geschrieben:
template<class Value, class Default> struct GetPolicy { template<bool issame> struct Inner { typedef typename IfThenElse < issame, Default, Value >::result result; }; typedef Inner<IsSame<Value,DefaultPolicy>::result>::result result; };
manchmal ist es wirklich lustig welche fehler die compiler haben. und wie trivial die workarounds sind (nur eine neue abstraktions ebene einfuehren)
[edit]tippfehler im code[/edit]
-
Shade Of Mine schrieb:
manchmal ist es wirklich lustig welche fehler die compiler haben. und wie trivial die workarounds sind
macht ja nichts. Wie ich sehe, schreibst du ja sowieso gerade einen vernüftigen Compiler. Wir schmeißen unsere dann weg
-
AndreasW schrieb:
Wie ich sehe, schreibst du ja sowieso gerade einen vernüftigen Compiler.
nicht das ich wuesste.
Wir schmeißen unsere dann weg
naja, aber ich muss sagen, der BCB 6 ist ziemlich standard konform. ich bin erst auf 2 bugs gestossen.
wenn ich mir dagegen die workarounds fuer den VC++6 und 7 ansehen *g*
interessant ist, dass ich keine workarounds brauchte ich bis jetzt fuer
CodeWarrior 8, gcc 3.2.3 und Intel C++ Compiler 7und der Digital Mars C++ Compiler ist der schlimmste. er kann zwar partial templare specialization, aber sonst nix