3

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>():

  1. erwartet Primärausdruck vor ')' token
  2. 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?

+1

braucht mehr 'template': http://stackoverflow.com/questions/610245/where -und-warum-ich-habe-ich-habe-die-schablonen-und-typen-schlüsselwörter einfügen –

+0

Danke, der Beitrag, den du verlinkt hast, ist sehr informativ! – Ose

Antwort

6

Sie müssen den Compiler ein wenig helfen, mit ihm zu sagen, dass ft ist eine Vorlage, wie folgt aus:

template<bool B> 
struct S { 
    static void f() { 
    } 
    template<int I> 
    static void ft() { 
    } 
}; 

template<bool B> 
void g() { 
    S<B>::f(); 
    S<B>::template ft<12>(); 
} 

int main() { 
    g<true>(); 
    return 0; 
} 
+0

Fantastisch, das hat den Trick gemacht! Ich habe gerade bemerkt, dass der C.13.6 "Template as a Qualifier" -Abschnitt von Stroustrups Programmiersprache C++ dasselbe beschreibt. Danke für Ihre Hilfe! – Ose