Frage

Nach dem C ++ Standard Funktionsparameter Name durch eine declarator-ID analysiert wird und ein declarator-id kann auch ein qualifizierter Name sein. Das heißt, ist der folgende Code perfekt gültig (wenn ich die entsprechenden Abschnitte in dem Standard richtig verstanden habe):

template<class T>
struct Sample
{
    int fun(int T::count); //T::count is qualified variable name
};

Meine Frage ist im Grunde, warum sollte jemand schreiben einen solchen Code? In welchen Situationen kann die Verwendung von qualifizierten Namen (in Funktion Parameterliste) von Vorteil sein?


EDIT:

Es scheint, dass ich die Abschnitte falsch verstanden. Anstelle des obigen Code können wir wahrscheinlich den folgenden Code schreiben (gemäß dem C ++ Standard):

template<class T>
struct sample
{
  void fun(int arr[T::count]);
};

gcc-4.3.4 compiles es perfekt. Aber dann, ich bin nicht ganz zufrieden, weil T :: Zählung nicht mehr ein Parameter ist (glaube ich).

War es hilfreich?

Lösung

Es ist ungültig. Die Syntax erlaubt beliebige Deklaratoren, aber 8.3.5p8 sagt

Eine Kennung kann optional sein als Parameternamen vorgesehen ist; wenn in einer Funktionsdefinition (8,4), es Namen ein Parameter (manchmal genannt „formales Argument“)

Bearbeiten Ein weiteres Zitat, das syntaktisch Einschränkungen Deklaratoren (8.3p1 [dcl.meaning]):

Jeder declarator enthält genau ein declarator-id; es Namen der Bezeichner das heißt erklärt. Die id-Expression ein declarator-id ist ein einfach sein Bezeichner bis auf die Erklärung von einigen Sonderfunktionen (12.3, 12.4, 13.5) und für die Erklärung der Vorlage Spezialisierungen oder teilweisen Spezialisierungen (14.7). Ein declarator-id darf nicht außer für die qualifiziert werden Definition einer Elementfunktion (9.3) oder statisches Datenelement (9.4) oder nested Klasse (9,7), die außerhalb seiner Klasse, die Definition oder explizite Instanziierung eine Funktion, Variablen oder Klasse Mitglied eines Namespace außerhalb seines Namensraum, oder die Definition eines vorher ausdrücklich erklärt Spezialisierung außerhalb seines Namensraum, oder die Erklärung eines Freund-Funktion, die ein Mitglied ist eine andere Klasse oder Namespace (11.4).

So in einer Parameterdeklaration, Sie müssen nicht qualifizierte Namen verwenden.

Bearbeiten : In der überarbeiteten Form, der Funktionsparameter Typ Zerfälle auf einen int*, noch bevor ein Test durchgeführt wird, ob T::count tatsächlich vorhanden ist und eine ganze Zahl konstant. Wenn Sie ein Beispiel möchten, wo ein qualifizierter Name in eine solche Unterschrift tun würde, etwas Sinnvolles, betrachten

template<class T>
struct sample
{
  void fun(int S=T::count);
};

Wenn fun ohne Parameter aufgerufen wird, die Compiler Bedürfnisse das Standardargument, um zu bestimmen, die dann versagt, wenn T kein count Mitglied hat, oder die nicht zu int umgewandelt werden.

Andere Tipps

Soweit ich Ihren Code zu verstehen ist schlecht ausgebildet, da

8.3 / 1 $: Wenn die declarator-ID qualifiziert ist, die Erklärung wird zu einem zuvor erklärt Mitglied der Klasse beziehen oder Namespace, zu dem der Qualifier bezeichnet, und das Element wird nicht eingeführt durch eine using-Deklaration im Rahmen der Klasse oder Namespace durch den verschachtelten-name-Bezeichner des declarator-id nominiert. [Anmerkung: Wenn das Qualifikationsspiel der global :: Bereichsauflösungsoperator, bezieht sich der declarator-ID zu einem Namen im globalen Namespace Gültigkeitsbereich deklariert. ]

P. S: Ich bin nicht 100% sicher. Bitte korrigieren Sie mich, wenn ich falsch bin. :)


In welchen Situationen ist die Verwendung von qualifizierten Namen (in Funktion Parameterliste) kann von Vorteil sein?

Lesen Sie Artikel 31 und 32 von Exceptional C ++ von Herb Sutter. Sowohl die Artikel befassen sich mit Koenig-Lookup und Interface-Prinzip.

Es scheint, dass ich die Abschnitte falsch verstanden. Anstelle diesem Code können wir wahrscheinlich den folgenden Code schreiben (gemäß dem C ++ Standard):

template<class T>
struct sample
{
  void fun(int arr[T::count]);
};

gcc-4.3.4 compiles es perfekt. Aber dann bin ich nicht ganz zufrieden, weil T::count ist keine Parameter mehr (ich glaube).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top