compilerfehler oder wirklich falsch?
-
template<int N1,int Z1,int N2,int Z2> struct Exp<var<N1,Z1>,var<N2,Z2> >{ private: template<class N> struct ExpFraction{ //X^N/N! //typedef typename Div<Pow<var<N1,Z1>,N>,Fac<N> >::Value Value; typedef var<1,1> Value;//debug ausgabe,funzt nicht }; public: //funktioniert nicht //typedef typename Sum<ExpFraction,var<N2,Z2> >::Value Value; //funktioniert typedef typename Sum<Fac,var<N2,Z2> >::Value Value; };
man muss nicht unbedignt den ganzen code dahinter kennen, um das zu verstehen, aber sobald die nested class benutzt wird, geht der compiler aufjedenfall in einem hübschen feuerball unter ;), nach einer suche von google hab ich nun 2 antworten gefunden:
1. das passiert, weil die nested class fehlerhaft ist
2. das passiert, weil der gcc fehlerhaft istwas stimmt denn nun?
wie gesagt, solange die nested class nicht benutzt wird, ist der compiler happy, und der debug-value kann keinen fehler produzieren ;)...
-
Auf den ersten Blick würde ich sagen, ExpFraction ist private, das heißt, Sum kann die Klasse nicht sehen und dementsprechend nicht benutzen.
-
neee, daran kann es nicht liegen *kurz test*....neee daran lags nicht
-
Hallo,
also grundsätzlich kannst du eine nested-class als Templateargument verwenden. Und grundsätzlich unterstützt der gcc das auch (zumindest ab Version 3.x)
Das:typedef typename Sum<ExpFraction,var<N2,Z2> >::Value Value;
kann allerdings nur funktionieren, falls Sum als ersten Parameter ein Template-Template-Parameter mit genau einem Parameter erwartet. Ansonsten fehlt da das Template-Argument für ExpFraction.
Mehr kann man imo ohne Kontext nicht sagen.
-
sum erwartet das auch, und bekommt es auch :).
deshalb hab ich auch Fac rangezogen, da es einen templateparameter erwartetes ist ja auch kein compile error, sondern ein internal compiler error...
-
der fehler ist jetzt auch an einer anderen stelle aufgetereten
-
eine frage: gibts einen besseren, bzw gleichguten compiler, als den der im mingw(also gcc) enthalten ist?
comeau ist leider im moment ein bissl zu teuer für meinen geldbeutel fürchte ich...
-
Es gibt noch den Visual C++ Compiler kostenlos:
http://msdn.microsoft.com/visualc/vctoolkit2003/
-
naja, vielleicht findet er ja den fehler, ein stark abgespeckter codeschnipsel hat aufjedenfall funktioniert...
-
puuuh, wenigstens hat der vc++ keinen internen compiler error...
dafür peinigt auch er mich:struct Cancel<var<N,Z> >{ enum{ggt=hidden::Ggt<N,Z>::Value}; typedef var<N/ggt,Z/ggt> Value;//hier ist der fehler };
da sagt er, dass das keine compiletime constante operation wär,der gcc nimmt das aber...
btw:ich konnte nun alle basic operationen testen, +,-,/,*,Fakultät,summe und quadrieren mit ganzen exponenten testen,klappt problemlos, und für den rest muss ich kürzen,bzw mindestens wissen,ob N%Z==0 ist...