Angenommen, ich habe eine statische Funktion Vorlage template<int I> void ft()
innerhalb einer Struktur Vorlage template<bool B> S
, und ich mag template<bool B> void g()
ft
von einer anderen Funktionsvorlage rufen, um die Parameter bool Vorlage g
-S
vorbei:Aufruf statische Funktion Vorlage innerhalb abhängig Umfangs
template<bool B>
struct S {
static void f() {
}
template<int I>
static void ft() {
}
};
template<bool B>
void g() {
S<B>::f();
S<B>::ft<12>();
}
int main() {
g<true>();
return 0;
}
Kompilieren dies in GCC 4.5.2 gibt zwei Fehler über die Linie S<B>::ft<12>()
:
- erwartet Primärausdruck vor ')' token
- ungültigen Operanden von Typ '< ungelösten überladenen Funktionsart >' und 'int' auf binär 'Operator <'
Comeau (http://www.comeaucomputing.com/tryitout/), in strikten C++ 03 Modus, beschwert sich auch über diese Zeile, mit "erwartet einen Ausdruck", mit einem Caret knapp unter der schließenden Klammer. Kein Compiler beschwert sich jedoch über die Zeile S<B>::f()
, und Comeau kann tatsächlich das gesamte minimale Beispiel im entspannten Modus kompilieren.
Wenn ich g
's-Vorlage, und instanziiert statt S
' entfernen s Template-Parameter in g
wie so:
void g() {
S<true>::ft<12>();
}
int main() {
g();
...
GCC kompiliert es erfolgreich, ebenso wie Comeau in striktem C++ 03-Modus.
Von oben zweite Fehler des GCC, so scheint es, dass es eine Mehrdeutigkeit bei der Interpretation von S<B>::ft<12>
ist, als ob es ich versuche zu testen denkt, wenn S<B>::ft
weniger als 12. Ich bin mir dessen bewusst die Verwendung von typename
zu Auflösen von Mehrdeutigkeiten, die auftreten, wenn auf Typen innerhalb abhängiger Bereiche verwiesen wird. Kann jemand die Ambiguität lösen, wenn die Sache, die in einem abhängigen Bereich erscheint, eine Funktion und kein Typ ist?
braucht mehr 'template': http://stackoverflow.com/questions/610245/where -und-warum-ich-habe-ich-habe-die-schablonen-und-typen-schlüsselwörter einfügen –
Danke, der Beitrag, den du verlinkt hast, ist sehr informativ! – Ose