Ich möchte std::tr1::hash<boost::tuple<A,B,C> >
definieren. Aber ich bekomme einen Fehler, der nicht erscheint, wenn ich eine vollständige Instantiierung gebe. Hier ist der Code
Das erste Stück gibt diesen Fehler
%Vor%und die zweite kompiliert gut. Was stimmt nicht mit der ersten Vorlage? Ich benutze gcc 4.3.4.
Sie müssen das Schlüsselwort .template
verwenden:
Dies ist erforderlich, weil der Typ von t
von drei Vorlagenparametern abhängt (und daher t
vom Typ abhängig ist), und get<0>
ist der Name einer Vorlagenspezialisierung. Aus dem C ++ - Standard - §14.2/4
:
Wenn der Name einer Mitgliedervorlagen-Spezialisierung nach erscheint. oder - & gt; in einem postfix-expression ... und der Objektausdruck des postfix-expressions ist typabhängig ... der Name der Mitgliedervorlage muss der Keyword-Vorlage vorangestellt sein. ...
Diese Anforderung besteht, damit Vorlagen analysiert werden können, bevor ihre Typargumente bekannt sind.
Betrachten Sie zum Beispiel:
%Vor% Ohne die .template
-Regel könnte dies als zwei verschiedene Dinge interpretiert werden:
Die tatsächlichen Regeln erlauben f . set < 0 > ( 2 == 3 )
eindeutig als eine Reihe von Vergleichsoperationen zu analysieren. Sie bedeuten auch, dass t.get<0>()
als t.get < 0 > ()
analysiert wird. Der expected primary-expression
soll sich in der leeren ()
befinden.
Ich habe keine Zeit, die Dinge zu überprüfen, aber ich würde entweder
erwarten %Vor%oder
%Vor% anstelle von t.get<0>()
Do qualifiziere get (), selbst wenn du Namespaces verwendest, oder ADL wird dir beim Mischen solcher Bibliotheken schlecht tun. Siehe Was sind die Fallstricke von ADL?