hab "kann nicht in einem Konstanten-Ausdruck" bei Verwendung der Vorlage
template < int >
class CAT
{};
int main()
{
int i=10;
CAT<(const int)i> cat;
return 0; //here I got error: ‘i’ cannot appear in a constant-expression
}
sogar
int i=10;
const int j=i;
CAT<j> cat; //this still can not work
aber ich habe umwandeln i, const int ,warum der compiler immer noch Fehler melden ?
meine Plattform ist ubuntu,gcc version 4.4.3
Dank,
==============
Dank allen für Ihren Beitrag, aber in einigen Fällen,ich brauche eine nicht-const-variable ,
Beispiel:
//alloperations.h
enum OPERATIONS
{
GETPAGE_FROM_WEBSITE1,
GETPAGE_FROM_WEBSITE2,
....
};
template< OPERATIONS op >
class CHandlerPara
{
static string parameters1;
static string parameters2;
....
static void resultHandler();
};
//for different operations,we need a different parameter, to achieve this
//we specified parameters inside CHandler, for example
template<>
string CHandlerPara< GETPAGE_FROM_WEBSITE1 >::parameters1("&userid=?&info=?..")
template<>
string CHandlerPara< GETPAGE_FROM_WEBSITE1 >::parameters2("...")
anderen Modul wird mit dieser Vorlage die entsprechenden parameter
und vielleicht specilize die resultHandler-Funktion für ein besonderes Verhalten
- Denken Sie daran: Eine Menge Zeit, wenn Sie Fehler erhalten, auf einer Linie, es ist eine Menge Zeit, eine Linie oben. Als James' Antwort zeigt.
- Nur weil ein Typ ist const bedeutet nicht, dass seine Wert ist.
- Ich wiederhole: Nur weil ein Typ ist const bedeutet nicht, dass es Wert ist. Man könnte sagen
f(rand());
oderint i = rand()
. Nur Schmatzen const auf die Art nicht meine Sache. - Wo genau soll ich da einstellen? Erwarten Sie, dass die Benutzer zu liefern, das zur Laufzeit? Oder wird es bei der Kompilierung geändert werden? Wenn letzteres, dann mit einem command-line-Konstrukte wie "g++ -Di=10" und definieren nicht "int i" in Ihrem code. (Am besten mit einer mehr beschreibenden und eindeutigen Namen als "ich" in diesem Fall.)
- Danke GMan,ich habe Ihre Idee
Du musst angemeldet sein, um einen Kommentar abzugeben.
Non-type template argument muss eine compile-Zeit-Konstante. Gießen ein
int
zu einemconst int
nicht machen es zu einem compile-Zeit-Konstante. Sie müssen entweder verwenden10
direkt:oder machen
i
eineconst int
:Es ist wichtig zu verstehen, was Vorlagen sind: Sie sind code erneut instanziiert für jede Kombination von spezifischen template-Typen oder Werte.
Diese Fragen
f
zu erstellen eine andere Art vonCAT<>
jedes mal, wenn es läuft, aber Vorlagen, die behoben werden müssen, zur Kompilierungszeit. Konzeptionell ist der compiler möglicherweise bewältigen, wenn Sie immer nur genanntf()
mit den Werten könnte es zu compile-Zeit, aber wenn Sie planen, die kann man dann einfach schreiben:Diese wird generieren mehrere
f()
Funktionen, die das erstellen von benutzerdefinierten CAT<> instantiierungen.Den C++ Standard nicht sogar Fragen Sie den compiler unter VORBEHALT akzeptieren die
void f(const int j)
- version - es wäre nur unseriös Gepäck hängen herum und warten darauf, zu scheitern, wenn jemand ging, um es mit einem Wert zur Laufzeit bestimmt. Menschen, die sich auf die Schnittstelle, ohne den Blick auf die gesamte Umsetzung erwarten würdef()
aufrufbar sein, mit solchen Laufzeit-Werte - z.B.f(atoi(argv[2]))
. Oder Sie setzenfor (int i = 0; i < 100000; ++i) f(i)
. Wennf()
nimmt eineint
zur Laufzeit, und sagen gibt es zuCAT
als Konstruktor-argument (D. H. als parameter zur Laufzeit statt einer template-parameter), dann ist das schön und gut, aber wenn der compiler hatte zu instanziieren von 100.000 Versionen vonf()
jeder spezialisiertCAT<>
s mit aufeinanderfolgenden Werten voni/N
den ausführbares Programm Größe könnte enorm werden (Optimierung - falls aktiviert - kann mindern).