sogar
%Vor% aber ich habe const int konvertiert, warum Compiler immer noch Fehler melden?
Meine Plattform ist ubuntu, gcc Version 4.4.3
Danke,
==============
Vielen Dank für Ihre Eingabe, aber in einigen Fällen brauche ich eine nicht-const Variable,
zum Beispiel:
%Vor%anderes Modul verwendet diese Vorlage, um den entsprechenden Parameter zu erhalten und vielleicht die resultHandler-Funktion für ein spezielles Verhalten spekulieren
Ein nicht typisiertes Vorlagenargument muss eine Kompilierzeitkonstante sein. Das Umwandeln von int
in const int
macht es nicht zur Kompilierzeitkonstante. Sie müssen entweder 10
direkt verwenden:
oder make i
a const int
:
Es ist wichtig zu verstehen, welche Vorlagen verwendet werden: Sie sind Code, der für jede Kombination bestimmter Schablonentypen oder -werte erneut instanziiert wird.
%Vor% Dies fordert f
dazu auf, bei jeder Ausführung einen anderen Typ von CAT<>
zu erstellen, aber Vorlagen müssen zur Kompilierzeit aufgelöst werden. Vom Konzept her könnte der Compiler damit zurechtkommen, wenn Sie nur f()
mit Werten aufgerufen haben, die zur Kompilierungszeit berechnet werden könnten, aber wenn Sie das planen, können Sie einfach schreiben:
Dieses wird mehrere f()
-Funktionen generieren, die benutzerdefinierte CAT & lt; & gt; Instanziierungen.
Der C ++ Standard fordert den Compiler nicht einmal auf, die void f(const int j)
Version vorläufig zu akzeptieren - es wäre nur zweifelhaftes Gepäck, das herumhängt und darauf wartet, zu versagen, wenn jemand es mit einem zur Laufzeit bestimmten Wert benutzt. Leute, die die Schnittstelle betrachten, ohne über die gesamte Implementierung zu schauen, würden erwarten, dass f()
mit solchen Laufzeitwerten aufrufbar ist - z. %Code%. Oder sie setzen f(atoi(argv[2]))
. Wenn for (int i = 0; i < 100000; ++i) f(i)
ein f()
zur Laufzeit nimmt und sagt, dass es int
als Konstruktorargument gibt (also als Laufzeitparameter und nicht als Template-Parameter), dann ist das in Ordnung und gut, aber wenn der Compiler musste 100.000 Versionen von CAT
instanziieren, die auf f()
s spezialisiert sind, mit aufeinanderfolgenden Werten von CAT<>
die Größe des ausführbaren Programms könnte sehr groß werden (Optimierung - falls aktiviert - kann das mindern).
Tags und Links c++ templates parameters non-type