2015-04-23 2 views
5

Ich habe Nutzung gesehen wie:Deklarieren einen unvollständigen Typ Template-Parameter in in-der Argumentliste

boost::error_info<struct tag_name, std::string> name_info; 

Hier tag_name Namen ein unvollständiger Typ und die struct Schlüsselwort vorhergehenden er es an Ort und Stelle zu erklären scheint, statt der etwas mehr wortreich:

struct tag_name; 
boost::error_info<tag_name, std::string> name_info; 

Was ist der relevante Teil des Standards, der dies erlaubt?

Antwort

6

§3.4.4/2 legt fest, wie erarbeitet-Typ-Bezeich in jeder Situation, nachgeschlagen werden und welche Auswirkungen sie haben können:

Wenn die Erarbeitet-type-specifier durch eingeführt wird die Klasse-Schlüssel und diese Lookup finden nicht ein zuvor erklärt Typname [..] die erarbeitet-Typ-Spezifizierer ist eine Erklärung, dass die führt Klassenname wie in 3.3.2 beschrieben.

Dann §3.3.2/7 (0,2) liest

Der Punkt der Deklaration einer Klasse in einem ersten deklariert erarbeitet-Typ-Spezifizierer ist wie folgt: [..] für eine erarbeitet-Typ-Spezifizierer des Formulars

                  Klasse-key Identifikator

wenn die -Typ-Spezifizierer erarbeitet sind in der DECL-Spezifizierer-seq oder Parameter-Erklärung-clause eine Funktion im Namensraum-Bereich definiert verwendet, Der Bezeichner wird als Klassenname im Namespace deklariert, der die Deklaration enthält; ansonsten, außer als friend Deklaration, Der Bezeichner wird im kleinsten Namespace oder Blockbereich deklariert, der die Deklaration enthält.

Verwandte Themen