Verwendung von boost :: tuple in tr1 :: hash

8

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

%Vor%

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.

    
pythonic metaphor 18.11.2011, 16:48
quelle

2 Antworten

8

Sie müssen das Schlüsselwort .template verwenden:

%Vor%

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:

%Vor%

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.

    
Mankarse 18.11.2011, 16:55
quelle
6

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?

    
sehe 18.11.2011 16:53
quelle

Tags und Links