Warum hängt sich VS2010 hier auf?
-
Hi,
ich weiß nicht, ob dies als Minimalbeispeil taugt - ich kompilier da schon ne Studne dran rum um es einzugrenzen...aber gerade bin ich zu Baff um weiter zu suchen.
Folgender Codeausschnitt:
#include <cstdlib> template<class I, class L> class LabeledData{ public: static const std::size_t DefaultBatchSize = 256; }; template<class T> class CVFolds{}; //vorwärtsdeklaration template<class I,class L> CVFolds<LabeledData<I,L> > createCVSameSize(LabeledData<I,L>& set,std::size_t numberOfPartitions, std::size_t batchSize=LabeledData<I,L>::DefaultBatchSize); //implementation template<class I,class L> CVFolds<LabeledData<I,L> > createCVSameSize(LabeledData<I,L>& set,std::size_t numberOfPartitions,std::size_t batchSize){return CVFolds<LabeledData<I,L> >();} int main() { //Und nun lassen wirs crashen :-) LabeledData<int,int> set; CVFolds<LabeledData<int,int> > folds = createCVSameSize(set, 10); }Das Resultat: fatal error C1001: Interner Compilerfehler. Wir hatten doch letztens mal so eine Comptition, wo es darum ging, mit legalem Code compiler abzuschießen. kriege ich ein Eis?
Und woran liegts? an dem default Argument in der Vorwärtsdeklaration. Entferne ich die Vorwärtsdeklaration, dann funktionierts. schreibe ich statt LabeledData<I,L>::DefaultBatchSize einfach 256, funktioniert es auch. Ein chter Qualitätscompiler.
Die Frage ist nun, wie ich da am besten den Workaround mach. Ich hatte die Implementation vorher in einer externen Datei ausgelagert und dabei würd ich es auch gerne belassen (auch wenn es der offensichtliche fix wäre). Andere Workarounds?
-
Habs mal intern an MS weitergeleitet... melde mich, wenn ich was gehört habe... Du kannst es aber auch direkt an connect melden:
http://connect.microsoft.com/VisualStudio
-
Immerhin kam schon von einem anderen MVP die Rückmeldung, dass es sich mit Comeu wohl kompilieren lässt

http://www.comeaucomputing.com/tryitout/Hilft Dir aber auch nicht... ist also wohl ein MS bug...
-
Hi,
Es geht damit auf 4 Compilern: GCC 4.7, GCC 4.2.1, Clang 3.0 und Comeau. Der fix ist auch relativ einfach, aber ich bin trotzdem Baff, dass es den Compiler zerbrezelt.
Dank fürs weiterleiten.
//edit ich lasse 4.2.1 nochmal checken, da bin cih mir gerade doch nicht 100% sicher

//edit2 ancient.gcc schluckts
-
Also, der Minimal-Code ist wohl:
template <class I> struct C { static const unsigned value = 256; }; template <class T> void f(C<T> set, unsigned = C<T>::value); template <class T> void f(C<T> set, unsigned) { return; } int main() { f(C<int>()); }MS hat intern einen Bug eingetragen. Ich würde Dir aber trotzdem empfehlen einen Bug auf Connect zu eröffnen, so dass es ein "ofizieller" Bug wird. Am besten mit dem (internen) Titel: "ICE when default argument uses dependent name"

-
Ich hab wohl genau den Bug schon vor einiger Zeit mal gemeldet, du kannst ihn einfach hochvoten: http://connect.microsoft.com/VisualStudio/feedback/details/759770/error-c2783-in-function-default-argument#details
Ich hoff der wird endlich mal gefixed, das Ding stört mich schon seit über nem Jahr...
Edit: Ok, zu voreilig, ist wohl nicht der gleiche Bug...
-
wie siehts denn mit vc11 und 12 aus? schlucken die das?
@Jochen mach ich morgen. Danke für deine Hilfe!
-
Nein VS 11 (== VS 2012) hat den Bug immer noch...
-
Bei allen VC++ Compilern tritt der Fehler auf... Auch der neuesten von vor 1 Woche...