hat "kann nicht in einem Konstantenausdruck erscheinen", wenn eine Vorlage verwendet wird

8
%Vor%

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

    
camino 21.10.2010, 04:46
quelle

2 Antworten

17

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:

%Vor%

oder make i a const int :

%Vor%     
James McNellis 21.10.2010, 04:48
quelle
9

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:

%Vor%

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).

    
Tony Delroy 21.10.2010 05:27
quelle

Tags und Links