Einer meiner Klassen eine Templat-Funktion erklärt:Teil Spezialisierung des Operators()
template<class A, class B>
A do_something(const std::vector<B> &data)
, die ich teilweise mag auf typename A
spezialisieren. B
ist eine Familie von Typen, die eine ziemlich minimale Schnittstelle implementieren, und wir verwenden eine Menge von ihnen, also möchte ich, dass meine Spezialisierung auf B
generisch ist. Ich vermute, dass dies doppelt ärgerlich ist, da typename A
nur als Rückgabetyp verwendet wird.
Aus dem Internet habe ich nachgelesen, dass ich nicht teilweise eine Funktion spezialisieren kann, also habe ich eine Klasse wie folgt erstellt:
template<class A, class B>
class do_something_implementation {
public:
do_something_implementation(const std::vector<B> &data_) {
data = data_;
}
int do_something_implementation<int, B>::operator()() {
/* Complicated algorithm goes here... */
}
double do_something_implementation<double, B>::operator()() {
/* Different complicated algorithm goes here... */
}
private:
std::vector<B> data;
}
Wenn ich versuche, das zu kompilieren (Visual Studio 2008), der Compiler stürzt ab() und ich bekomme die folgende Fehlermeldung:
fatal error C1001: An internal error has occurred in the compiler.
ich nehme an, das ist mein Problem und nicht der Compiler. Gibt es eine bessere Möglichkeit, die angestrebte Teilspezialisierung auszudrücken?
Wenn ein Compiler stirbt, ist es ein Problem mit dem Compiler - nicht in der Lage, Ihnen zu sagen, wie falsch Ihr Code ist. Es gibt ein paar Dinge in Ihrem Code falsch, aber das erklärt nicht eine "interne Fehler" Nachricht. Natürlich wäre die richtige Sache für den Compiler nicht, den Code trotzdem zu kompilieren ... aber es sollte eine bessere Diagnose liefern als "Ich habe zu Tode gehockt" –
@David: Compiler-Autoren sind keine Götter von Bug Free Software! Dies kann oder wird möglicherweise nicht in einer späteren Version behoben. –